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을 뺸다.

 

과제로 편리하지만 가독성이 떨어지고 유지보수가 어려워서 실무에선 사용할 수 없을것 같다.