안녕, 세상!

7. 이벤트 프로그래밍 (2) 본문

It공부/Java

7. 이벤트 프로그래밍 (2)

dev_Lumin 2020. 7. 14. 07:24

(4) ActionEvent

ActionEvent는 버튼을 클릭하거나 콤보박스에서 특정 아이템을 선택한 경우에 발생하는 이벤트로 구현하기 위해서ActionListener 리스너를 사용합니다.

 

버튼을 클릭하면 ActionEvent가 발생하게 하기 위한 방법은 다음과 같습니다.

 

 

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class 클래스명 extends JFrame implements ActionListener {

    생성자 ( ) {

        ....        // 윈도우 컴포넌트의 생성 및 배치

    버튼.addActionListener(this);   // 컴포넌트에 액션 이벤트 등록

    }

    void actionPerformed(ActionEvent e) {   // 버튼을 클릭했을 때 실행되는 메소드

        ....

    }

 

    public static void main(String[] args) {

        클래스명 f = new 클래스명( );

    }

}

 

 

다음은 ActionListener 인터페이스를 이용해서 ActionEvent를 발생시키는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class actionsample1 extends JFrame implements ActionListener{
    JButton bt1,bt2;
    JLabel lb;
    public actionsample1() {
        setTitle("액션예제");
        setLayout(new FlowLayout());
        bt1=new JButton("전사");
        bt2=new JButton("마법사");
        lb = new JLabel("직업을 선택하세요.");
        add(bt1);
        add(bt2);
        add(lb);
        bt1.addActionListener(this);
        bt2.addActionListener(this);
        setSize(250,200);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==bt1)
            lb.setText("전사를 선택하였습니다.");
        if(e.getSource()==bt2)
            lb.setText("마법사를 선택하였습니다");
    }
    public static void main(String [] args) {
        actionsample1 f = new actionsample1();
    }
}
 
cs

 

전사 버튼을 클릭하면 "전사를 선택하였습니다"라는 라벨이 텍스트 형태로 나타나고 마법사 버튼을 클릭하면 다음과 같이 "마법사를 선택하였습니다"라고 텍스트 형태로 나오는 코드입니다.

 

e.getSource() - 이벤트 발생 시 해당되는 컴포넌트의 변수를 불러옴

 

 

컴포넌트의 문자열 처리 방법

컴포넌트.getText();      // 컴포넌트에 입력되어 있는 문자열 가져오기

컴포넌트.setText();      // 컴포넌트에 문자열 출력하기

 

 

다음은 ActionEvent를 발생시키는 또 다른 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class actionsample2 extends JFrame implements ActionListener {
    JButton bt;
    JPanel pn1, pn2;
    JLabel lb;
    JTextField tf1, tf2;
    public actionsample2() {
        setTitle("더하기 프로그램");
        pn1= new JPanel();
        pn2= new JPanel();
        
        bt = new JButton("더하기");
        bt.addActionListener(this);
        pn1.add(bt);
        tf1 = new JTextField(12);
        tf2 = new JTextField(12);
        pn2.add(tf1);
        pn2.add(tf2);
        lb = new JLabel("두 개의 수를 더합니다");
        
        add("North",pn1);
        add("Center",pn2);
        add("South",lb);    //setLayout 을 안해도 오류가 안남 (BorderLayout)
        
        setSize(300,300);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e) {
        double d1,d2,d3;
        if(e.getSource()==bt) {
            d1 = Double.parseDouble(tf1.getText());
            d2 = Double.parseDouble(tf2.getText());
            d3 = d1+d2;
            lb.setText("덧셈 결과는"+d3);
        }
    }
    public static void main(String [] args) {
        actionsample2 ac = new actionsample2();
    }
}
cs

위의 코드는 textfield에 원하는 두 숫자를 넣고 '더하기' 버튼을 누르면 두 수를 더한 결과값이 맨 밑의 라벨에 표기되는 코드입니다.

버튼, 텍스트필드, 라벨은 판넬을 이용해서 영역을 나눴습니다.

 

문자열을 숫자로 변환하는 방법

Integer.parseInt("문자열');     // 문자열을 정수 형태의 숫자로 변환

Double.parseDouble("문자열");    // 문자열을 실수 형태의 숫자로 변환

 

 

 

 

 

 

(5) ItemEvent

ItemEvent는 체크박스나 라디오버튼과 같이 특정 항목을 선택한 경우에 발생하는 이벤트로, 이러한 이벤트가 발생했을 때 이벤트 구현을 하기 위해서는 ItemListener 리스너를 상속받아 이용하여야 합니다.

 

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class 클래스명 extends JFrame implements ItemListener {

    생성자( ) {

     ....

    객체.addItemListener(this);   // 각 체크박스나 라디오버튼에 ItemListener 이벤트 등록

    }

 

    void itemStateChanged(ItemEvent e) {  // 체크박스나 라디오 버튼을 선택했을 때 실행되는 메소드

    ....

    }

 

    public static void main(String [] args){

        클래스명 f = new 클래스명( );

    }

}

 

 

다음은 체크박스를 이용하여 ItemEvent를 발생시키는 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class itemeventsample extends JFrame implements ItemListener {
    JLabel lb;
    JPanel pn;
    JTextArea ta;
    JCheckBox cb1, cb2, cb3;
    
    public itemeventsample() {
        setTitle("체크박스 이벤트");
        lb = new JLabel("항목을 선택하시오");
        ta = new JTextArea();
        cb1 = new JCheckBox("딸기");
        cb2 = new JCheckBox("바나나");
        cb3 = new JCheckBox("사과");
        cb1.addItemListener(this);
        cb2.addItemListener(this);
        cb3.addItemListener(this);
        
        pn = new JPanel();
        pn.add(cb1);
        pn.add(cb2);
        pn.add(cb3);
        
        add("North",lb);
        add("Center",ta);
        add("South",pn);
        setSize(300,200);
        setVisible(true);
    }
    public void itemStateChanged(ItemEvent e) {
        if(cb1.isSelected())  // cb1가 선택된다면
            ta.append("\n베리베리스트로베리!");
        if(cb2.isSelected())  // cb2가 선택된다면
            ta.append("\n뻐내노!");
        if(cb3.isSelected())  // cb3가 선택된다면
            ta.append("\n모닝애플!");
    }
    
    public static void main(String [] args) {
        itemeventsample ies = new itemeventsample();
    }
}
cs

아래의 체크박스에서 항목을 선택할 때 텍스트에어리어에 해당 항목과 관련된 문장이 나오는 코드입니다.

다음과 같은 결과가 나온 이유는 '딸기' 를 먼저 선택한 후 '사과' 를 선택했는데 '사과'를 선택하기 직전에는 '딸기'가 이미 선택된 상태이므로 그 상태에서 '사과'를 선택했으므로 '딸기'와 관련된 문장이 한 번 더 나오게 된 것입니다.

위의 코드에서 조건문을 모두 if문으로 써서 다음과 같이 나오게 된 것입니다.

 

isSelected( ) 메소드

체크박스객체.isSelected( );     // true: 체크박스가 선택된 경우

                                       // false: 체크박스가 선택되지 않은 경우

                                       // boolean 형태로 값을 반환합니다.

 

 

라디오버튼으로 ItemListener을 이용해서 ItemEvent를 발생시키는 방법도 체크박스 구현과 같습니다.

 

 

 

 

 

 

(6) 메뉴와 메뉴에서의 이벤트

윈도우 형태의 프로그램에서 특정 기능을 수행하기 위한 방식으로 메뉴를 많이 사용합니다.

Swing 패키지를 이용하여 메뉴를 구성하기 위해서는 JMenuBar, JMenu, JMenuItem과 같은 클래스를 이용해야 합니다.

 

JMenuItem

메뉴를 이용하여 특정 기능을 실행할 수 있는 클래스로서 메뉴의 구성에 있어 가장 하위의 클래스입니다.

JMenuItem클래스는 반드시 Jmenu 클래스에 추가되어야 합니다.

 

JMenu

윈도우의 메뉴 바에 표시되는 항목으로서 JMenuItem을 포함할 수 있는 클래스입니다.

한 개 이상 생성하여 메뉴 바에 추가할 수 있으며 그 자체로는 특정 기능을 실행하지 않고 JMenuItem에서 기능을 실행합니다.

 

JMenuBar 

윈도우에 메뉴를 구성하기 위해 반드시 필요한 클래스로서 메뉴를 포함할 수 있는 막대 모양의 틀입니다.

add() 메도스를 이용하여 메뉴를 추가할 수 있으며, setJMenubar() 메소드를 실행하면 윈도우에 메뉴 바가 장착됩니다.

 

 

 

import javax.swing.*;

import java.awt.event.;

import java.awt.*;

 

JMenuBar 객체1 = new JMenuBar();       // 메뉴 바의 생성

    ....

JMenu 객체2 = new JMenu("메뉴이름");      // 메뉴 생성

    ....

JMenuItem 객체3 = new JMenuItem("메뉴아이템이름");    // 메뉴 아이템 생성

    ....

mFile.add(객체3);           // 메뉴에 메뉴 아이템 추가

    ....

mbar.add(객체2);          // 메뉴 바에 메뉴 추가

    ....

setJMenuBar(객체1);      // 메뉴 바를 객체로 등록

 

 

다음은 메뉴바에 메뉴들과 메뉴에 메뉴 아이템을 넣어서 메뉴 아이템을 누르면 이벤트가 발생하는 코드 예시입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class menusample extends JFrame implements ActionListener {
    JMenuBar mbar;
    JMenu mfile, medit, mhelp, mexit;
    JMenuItem iopen, isave;
    JMenuItem iexit1, iexit2;
    JMenuItem icopy, ipaste;
    JMenuItem ihelp;
    JTextField tf;
    public menusample() {
        setTitle("메뉴 예시");
        mbar=new JMenuBar();
        mfile = new JMenu("파일");
        iopen = new JMenuItem("열기");
        isave = new JMenuItem("저장");
        
        mexit = new JMenu("종료");
        
        mfile.add(iopen);
        mfile.add(isave);
        mfile.add(mexit);             // 파일 메뉴에 열기,저장,종료 항목들을 넣기
        iopen.addActionListener(this);   
        isave.addActionListener(this);     // 메뉴아이템들이 기능할 수 있도록 구현
        
        iexit1 = new JMenuItem("저장하고 종료");
        iexit2 = new JMenuItem("저장하지 않고 종료");
        
        mexit.add(iexit1);
        mexit.add(iexit2);                // 메뉴안의 메뉴에 메뉴아이템 추가
        iexit1.addActionListener(this);
        iexit2.addActionListener(this);   // 메뉴 아이템들이 기능할 수 있도록 구현
        
        medit = new JMenu("편집");
        icopy = new JMenuItem("복사");
        ipaste = new JMenuItem("붙이기");
        
        medit.add(icopy);
        medit.add(ipaste);
        icopy.addActionListener(this);
        ipaste.addActionListener(this);   // 메뉴 아이템들이 기능할 수 있도록 구현
        
        mhelp = new JMenu("도움말");
        ihelp = new JMenuItem("도움말 보기");
        mhelp.add(ihelp);
        ihelp.addActionListener(this);    // 메뉴 아이템들이 기능할 수 있도록 구현
        
        mbar.add(mfile);
        mbar.add(medit);
        mbar.add(mhelp);         // 파일, 편집, 도움 메뉴를 메뉴바에 넣기
        setJMenuBar(mbar);       // 메뉴바를 윈도우에 객체화시키기
        
        tf= new JTextField(30);
        add("South",tf);
        
        setSize(300,300);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==iopen)
            tf.setText("파일을 열겠다 휴먼");
        if (e.getSource()==isave)
            tf.setText("파일을 저장하겠다 휴먼");
        if (e.getSource()==iexit1)
            tf.setText("기억하고 있겠다 나중에보자 휴먼");
        if (e.getSource()==iexit2)
            tf.setText("진짜로 잊어버리란 말이냐 휴면");
        if (e.getSource()==icopy)
            tf.setText("복사하겠다 휴먼");
        if (e.getSource()==ipaste)
            tf.setText("붙이겠다 휴먼");
        if (e.getSource()==ihelp)
            tf.setText("혼자서 못하냐 휴먼");
    }
    public static void main(String [] args) {
        menusample ms = new menusample();
    }
}
cs

결과는 위와 같이 메뉴바에 메뉴들이 있고 메뉴 안의 메뉴 아이템을 누르면 이벤트가 발생해서 텍스트필드에 해당 이벤트 설정을 한 문장이 나옵니다.

'파일' 메뉴안의 '종료'는 메뉴 아이템이 아니라 메뉴입니다. 

'종료'라는 메뉴 안에 '저장하고 종료', '저장하지 않고 종료'라는 메뉴 아이템이 있는 것입니다.

즉, 메뉴 안에 메뉴를 넣고 그 메뉴에 메뉴 아이템을 다음과 같이 넣을 수 있습니다.

'It공부 > Java' 카테고리의 다른 글

9. 다중 쓰레드  (0) 2020.07.16
8. 그래픽  (0) 2020.07.15
7. 이벤트 프로그래밍 (1)  (0) 2020.07.13
6. 윈도우 프로그래밍  (0) 2020.07.12
5. 클래스 상속  (0) 2020.07.11
Comments