본문 바로가기

JAVA

[Java] 버튼의 이벤트 처리로 선 그리기

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. 실행결과