[Java] 학교 에서 스윙 을 가 르 치고 있 습 니 다. 간단 한 기능 이 실 현 된 정리 - 창 을 표시 하고 2D 도형 을 그 리 며 클릭 사건 을 감청 합 니 다.
38711 단어 Java
디 렉 터 리:
사용자 인터페이스 공구 꾸러미 역사
추상 창 패키지 (Abstract Window Toolkit, AWT) - > Swing 사용자 인터페이스 라 이브 러 리 - > JavaFX.
AWT: 사용자 인터페이스 요 소 를 처리 하 는 작업 을 대상 플랫폼 의 네 이 티 브 GUI 도구 꾸러미 에 위탁 합 니 다.
Swing: 바 텀 창 시스템 은 빈 창 만 표시 하고 사용자 인터페이스 요 소 를 빈 창 에 그립 니 다.
JavaFx:
창 보이 기
JFrame 은 다른 구성 요소 의 캔버스 입 니 다. 위 젯 은 Swing 이 아 닌 사용자 의 창 시스템 에서 그립 니 다.
가장 간단 한 보 이 는 창 만 들 기:
package simpleFrame;
import java.awt.*;
import javax.swing.*; //java
public class SimpleFrameTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(()-> // (event dispatch thread)
{
var frame = new SimpleFrame(); // Simple Frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 。
frame.setVisible(true);//
});
} // ,
}
class SimpleFrame extends JFrame // JFrame
{
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public SimpleFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
코드 설명:
JFrame 클래스 자 체 는 창 모양 을 바 꾸 는 몇 가지 방법 만 정 의 했 습 니 다. 그러나 종류 가 매우 많 기 때문에 창 속성 을 설정 하 는 방법 이 매우 풍부 합 니 다. 다음 과 같은 몇 가지 방법 을 보 여 줍 니 다.
창 에 내용 을 직접 그 릴 수 는 있 지만 그렇게 하지 않 습 니 다. 올 바른 방법 은 구성 요 소 를 창 에 추가 하고 구성 요소 에 정 보 를 그 리 는 것 입 니 다.
1. 창 에 구성 요 소 를 표시 하고 구성 요소 에 텍스트 정 보 를 그립 니 다.
package notHelloWorld;
import javax.swing.*;
import java.awt.*;
public class NotHelloWorld
{
public static void main(String args[])
{
EventQueue.invokeLater(()->
{
var frame = new NotHelloWorldFrame();
frame.setTitle("Not a Hello World");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
class NotHelloWorldFrame extends JFrame
{
public NotHelloWorldFrame()
{
add(new NotHelloWorldComponent());//
pack();// , getPreferredSize
}
}
class NotHelloWorldComponent extends JComponent
{
public static final int MESSAGE_X = 75;
public static final int MESSAGE_Y = 100;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public void paintComponent(Graphics g) //
{
g.drawString("Not a Hello World program!", MESSAGE_X, MESSAGE_Y);
}
public Dimension getPreferredSize() //
{
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
코드 설명:
Graphics 클래스: 직선, 사각형, 타원 등 을 그립 니 다. 기능 이 제한 되 어 있 습 니 다.
자바 2D 라 이브 러 리 의 도형 류: Graphics 류 의 키 종류 로 기능 이 더욱 풍부 합 니 다. 기본 적 인 도형 을 제외 하고 원호, 2 차 곡선, 3 차 곡선 등 도 그 릴 수 있 습 니 다. 여기 서 자바 2D 라 이브 러 리 의 도형 류 를 중심 으로 소개 합 니 다.
그림 그리 기 단계:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*; // shape , Ellipse2D
public class DrawTest {
public static void main(String[] args)
{
EventQueue.invokeLater(()-> //
{
var frame = new DrawFrame();
frame.setTitle("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(300, 300, 800, 800);
frame.setVisible(true);
});
}
}
class DrawFrame extends JFrame //
{
public DrawFrame()
{
add(new DrawComponent());//
pack(); //
}
}
class DrawComponent extends JComponent //
{
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 400;
public void paintComponent(Graphics g) //
{
var g2 = (Graphics2D) g;//Graphics2D Graphics ,
double leftX = 100;
double topY = 100;
double width = 200;
double height = 150;
var rect = new Rectangle2D.Double(leftX, topY, width,height);// , : , ,
g2.draw(rect);
var ellipse = new Ellipse2D.Double();
ellipse.setFrame(rect);//
g2.draw(ellipse);
var line = new Line2D.Double(leftX, topY, leftX + width, topY + height);// , : ,
g2.draw(line);
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 150;
var circle = new Ellipse2D.Double();
circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);//
g2.draw(circle);
}
public Dimension getPerredSize() //
{
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
}
몇 가지 보충 설명:
GUI 를 지원 하 는 모든 작업 환경 은 사용자 와 상호작용 을 해 야 합 니 다. 다시 말 하면 작업 환경 은 버튼 과 마우스 클릭 이 일어 나 는 사건 을 계속 감시 해 야 합 니 다. 관련 사건 이 발생 하면 작업 환경 은 프로그램 에 보고 하고 프로그램 은 이에 상응하는 동작 을 합 니 다. 먼저 다음 과 같은 몇 가지 명 사 를 설명 합 니 다.
package button;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ButtonFrame extends JFrame{
private JPanel buttonPanel;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public ButtonFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
//1.
var yellowButton = new JButton("Yellow");
var blueButton = new JButton("Blue");
var redButton = new JButton("Red");
//2.
buttonPanel = new JPanel();
//3.
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);
//4.
add(buttonPanel);
//6. ColorAction( )
var yellowAction = new ColorAction(Color.YELLOW);
var blueAction = new ColorAction(Color.BLUE);
var redAction = new ColorAction(Color.RED);
//7.
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
//5. , actionPerformed
private class ColorAction implements ActionListener
{
private Color backgroundColor;
public ColorAction(Color c)
{
backgroundColor = c;
}
// ActionEvent
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
}
public static void main(String[] args)
{
EventQueue.invokeLater(()->
{
var buttonFrame = new ButtonFrame();
buttonFrame.setVisible(true);
});
}
}
주의:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.