Java
[Java Swing] 다양한 Event 처리 방법
개발자가 말대꾸?
2022. 4. 29. 19:41
Swing과 AWT로 GUI를 구성하기 위한 기본적인 설정.
package school.poly.swing.pane.과제.이름_띄우기;
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame {
private static final int SCREEN_WIDTH = 500;
private static final int SCREEN_HEIGHT = 300;
Main(){
setting();
}
void setting(){
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(new Dimension(SCREEN_WIDTH,SCREEN_HEIGHT));
setVisible(true);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
Swing에는 많은 디자인 패턴이 있지만, psvm에서 Main의 생성자를 호출하는 방법을 사용했습니다.
setDefaultCloseOperation(EXIT_ON_CLOSE) | setDefaultCloseOperation메서드는GUI에서 종료를 눌렀을 때 처리하는 방법을 WindowConstants 인터페이스에 정의된 상수 중 설정할 수 있습니다. 0: DO_NOTHING_ON_CLOSE (default) 1: HIDE_ON_CLOSE 2: DISPOSE_ON_CLOSE 3: EXIT_ON_CLOSE |
setSize(SCREEN_WIDTH, SCREEN_HEIGHT) | GUI창의 사이즈를 SCREEN_WIDTH * SCREEN_HEIGHT으로 설정합니다. |
setResizable(boolean) | 창의 사이즈 조절을 설정합니다. true: 사이즈 조절 가능 (default) false: 사이즈 조절 불가능 |
setVisable(boolean) | 창의 가시를 조절합니다. true: 창을 보이게 합니다. false: 창을 숨깁니다. |
마우스 이벤트
c.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
JLabel label = new JLabel();
label.setSize(100,30);
label.setLocation(new Point(e.getX(),e.getY()));
label.setBackground(Color.red);
label.setText("김태우");
c.add(label);
label.updateUI();
setVisible(true);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
전체코드 ( 이름 라벨 생성기 )
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Main extends JFrame {
private static final int SCREEN_WIDTH = 500;
private static final int SCREEN_HEIGHT = 300;
Main() {
setting();
setVisible(true);
}
void setting() {
setTitle("클릭으로 이름 라벨 만들기");
Container c = getContentPane();
c.setLayout(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));
setResizable(false);
setLocationRelativeTo(null);
c.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
JLabel label = new JLabel();
label.setSize(100,30);
label.setLocation(new Point(e.getX(),e.getY()));
label.setBackground(Color.red);
label.setText("김태우");
c.add(label);
label.updateUI();
setVisible(true);
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
전체코드 (사과, 배, 체리)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class Main extends JFrame {
private static final int SCREEN_WIDTH = 500;
private static final int SCREEN_HEIGHT = 200;
private static JCheckBox apple = new JCheckBox("사과 100원");
private static JCheckBox pear = new JCheckBox("배 500원");
private static JCheckBox cherry = new JCheckBox("체리 20,000원");
private int price = 0;
private static JLabel label = new JLabel();
Main() {
setting();
setEvent();
setLabel();
}
private void setLabel(){
label.setText(String.valueOf(price));
}
private void setEvent() {
apple.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
price = e.getStateChange() == ItemEvent.SELECTED ? price + 100 : price - 100;
label.setText(String.valueOf(price));
}
});
pear.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
price = e.getStateChange() == ItemEvent.SELECTED ? price + 500 : price - 500;
label.setText(String.valueOf(price));
}
});
cherry.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
price = e.getStateChange() == ItemEvent.SELECTED ? price + 20000 : price - 20000;
label.setText(String.valueOf(price));
}
});
add(apple);
add(pear);
add(cherry);
setVisible(true);
}
private void setting() {
setTitle("과일 계산하기");
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setLayout(new FlowLayout());
setSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT));
add(label);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
삼항연산자가 편리한 이유
price = e.getStateChange() == ItemEvent.SELECTED ? price + 100 : price - 100;
e.getStateChage() 메서드는 Event e의 상태가 SELECTED인지, NOT_SELECTED인지 반환해준다.
위 코드는 SELECTED인 경우 price에 100을 더하고 NOT_SELECTED인 경우 100을 뺸다.
과제로 편리하지만 가독성이 떨어지고 유지보수가 어려워서 실무에선 사용할 수 없을것 같다.