1. 소개
- 전에 포스팅에서는 간단히 JFrame을 이용해 컴포넌트를 넣을 수 있는 화면을 만들었다.
2. 이번 포스트에서 할 것
- JFrame에 컴포넌트(Component) 넣기, 여기서는 JButton을 추가할 예정이다.
- 그리고 버튼으로 눌러서 뭐가 동작해야 만드는 게 느껴지겠죠?
- JButton에 이벤트 처리를 하고 버튼이 눌려졌을 때 선을 그려봅시다.
3. 코드
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame f = new JFrame("Button Demo");
ButtonPanel bp = new ButtonPanel();
f.add(bp);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setVisible(true);
}
}
class ButtonPanel extends JPanel implements ActionListener{
Color colors = Color.black;
public ButtonPanel() {
add(createButton("red", Color.red));
add(createButton("blue", Color.blue));
add(createButton("green", Color.green));
}
private JButton createButton(String text, Color background) {
JButton button = new JButton(text);
button.setBackground(background);
button.addActionListener(this);
return button;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton button = (JButton)e.getSource();
this.colors = button.getBackground();
repaint();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(colors);
g.drawLine(100, 200, 200, 200);
}
}
4. 코드설명
- ButtonPanel 클래스에서는 JPanel를 상속받으며, ActionListener 인터페이스를 상속받는다.
- ButtonPanel의 생성자는 버튼 3개를 더하며, createButton으로 동적으로 할당한다.
- 인터페이스를 상속받았으므로 그 안에 있는 추상메소드 actionPerformed 메소드를 구현한다.
- actionPerformed 메소드에서는 눌려진 버튼의 정보를 받고, colors의 색을 받아와 준다.
- paintComponent 메소드는 그려지는 코드에는 필수로 필요한 메소드다!!!(중요)
5. paintComponent(Graphics g) 메소드 설명
- Java swing으로 인터페이스로 짤 때 항상 쓰이는 코드이므로 따로 설명을 하겠다.
- 컴포넌트들이 다시 그려져야 할 때 (예시로 움직이거나, 크기가 변하거나, 다른 프레임에 가려질 때) , 이러한 이벤트들은 자체적으로 내부에서 자동으로 감지되고, 이때 paintComponent 메소드가 불려져서 갱신되게 된다.
- 사용자는 직접적으로 paintComponent 메소드를 부르지 않는다. 갱신이 필요할 때 repaint() 메소드를 사용한다.
- awt는 paint()메소드를 오버라이드, swing은 paintComponent()메소드를 오버라이드 한다.
- swing을 사용할 때 보통 paint()메소드를 오버라이드 하지 않는다.
6. 실행결과
'JAVA' 카테고리의 다른 글
[JAVA] CardLayout 패널 화면 쉽게 바꾸기 (0) | 2022.04.20 |
---|---|
[Java] 자바로 그림판 만들기(펜, 도형, 파일 읽기 쓰기, 색깔, 굵기) (0) | 2022.04.18 |
[Java] 이클립스와 Mysql 8.0 연동하기 (JDBC 연결) (1) | 2022.04.16 |
[Java] Swing을 이용한 간단한 JFrame 화면 만들기 (0) | 2022.04.14 |
[JAVA] 스택을 이용한 계산기(후위 표기법) (0) | 2022.04.12 |