자바 수업 6일차 (마지막)



☞ 스윙 이어서...


* 자바에서는 클래스 내부에 새로운 클래스를 포함하여 사용하는 것을 허용한다.

  - 이러한 클래스를 내부inner 클래스라 한다.

  - 내부 클래스는 다른 용도로도 사용할 수 있지만, 이벤트를 처리할 때 유용하다.


1
2
3
4
5
6
7
class OutClass {
    ......
    class InnerClass {  // 내부 클래스 선언.
        ......          // 외부 클래스의 모든 요소 사용 가능.
    }
    ......
}
cs


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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
class Event2 extends JFrame {
    JLabel jl;  // 버튼과 라벨을 클래스의 속성으로 지정.
    JButton jb1, jb2;
    
    public Event2() {
        Container ct = getContentPane();
        ct.setLayout(new FlowLayout());
        
        jb1 = new JButton("사랑합니다.");
        jb2 = new JButton("행복합니다.");
        jl = new JLabel("버튼을 누르세요.");
        jb1.addActionListener(new EventProcess());  // 두 개의 버튼에 리스너를 등록.
        jb2.addActionListener(new EventProcess());  // 처리 객체로 내부 클래스 지정.
        ct.add(jb1);
        ct.add(jb2);
        ct.add(jl);
        
        setTitle("Event Test2");
        setSize(250150);
        setVisible(true);
    }
    private class EventProcess implements ActionListener {
    // 내부 클래스로 인터페이스를 포함하는 클래스 작성.
        public void actionPerformed(ActionEvent e) {  // 이벤트 처리 루틴 작성.
            jl.setText(e.getActionCommand());  // 외부 클래스의 속성인 라벨을 직접 사용.
                                               // ActionEvent 객체를 이용하여
                                               // 버튼의 라벨값을 추출.
        }
    }
}
public class EventTest2 {
    public static void main(String[] args) {
        new Event2();
    }
}
cs



* 이벤트 처리를 위한 클래스를 별도로 작성하여 이벤트를 처리하는 방법


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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
class EventClass implements ActionListener {  // 별도의 이벤트 처리 클래스 생성.
    JLabel jl;
    public EventClass(JLabel jl) {
        this.jl = jl;
    }
    public void actionPerformed(ActionEvent e) {
        jl.setText(e.getActionCommand());
    }
}
class Event3 extends JFrame {
    JLabel jl;
    JButton jb1, jb2;
    public Event3() {
        Container ct = getContentPane();
        ct.setLayout(new FlowLayout());
        
        jb1 = new JButton("사랑합니다.");
        jb2 = new JButton("행복합니다.");
        jl = new JLabel("버튼을 누르세요.");
        jb1.addActionListener(new EventClass(jl));  // 리스너를 등록.
        jb2.addActionListener(new EventClass(jl));  // 처리 객체를 지정할 때 JLabel 객체 전달.
        ct.add(jb1);
        ct.add(jb2);
        ct.add(jl);
        
        setTitle("Event Test3");
        setSize(250150);
        setVisible(true);
    }
}
public class EventTest3 {
    public static void main(String[] args) {
        new Event3();
    }
}
cs



* ImageIcon 클래스

  - 이미지를 아이콘화하여 제공하는 클래스이다.

  - [형식]

ImageIcon(String filename)

ImageIcon(URL url)

※ filename : 이미지 파일을 지정하여 아이콘을 생성.

   url : 웹 주소를 지정하여 아이콘을 생성.


* JLabel 클래스

  - 라벨을 만드는 클래스이다.

  - [형식]

JLabel(ImageIcon i)

JLabel(String s)

JLabel(String s, ImageIcon i, int align)

※ i : ImageIcon 객체로 라벨 생성.

   s : 문자열을 사용하여 라벨 생성.

   align : 아이콘과 문자열의 위치를 의미.

           SwingConstants 인터페이스의 상수를 사용.

           (SwingConstants.LEFT, SwingConstants.RIGHT, SwingConstants.CENTER, SwingConstants.LEADING, SwingConstants.TRAILING)


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.*;
 
class JLabel1 extends JFrame implements ActionListener {
    private JLabel result = new JLabel();  // 이벤트 처리를 위해 속성으로 선언.
    public ImageIcon i1, i2;
    
    public JLabel1() {
        i1 = new ImageIcon("image/apple.jpg");  // 이미지 아이콘 객체 생성.
        i2 = new ImageIcon("image/pear.jpg");
        
        JButton apple = new JButton("사과");
        JButton pear = new JButton("배");
        
        Container ct = getContentPane();
        
        ct.setLayout(new FlowLayout());
        ct.add(apple);
        ct.add(pear);
        ct.add(result);
        
        apple.addActionListener(this);  // 버튼 객체에 리스너 등록.
        pear.addActionListener(this);
        
        setTitle("JLabel Test1");
        setSize(300250);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ae) {
        if(ae.getActionCommand() == "사과") {  // 버튼에 따라 결과를 출력.
            result.setText("맛있는 사과입니다.");
            result.setIcon(i1);  // 라벨의 아이콘을 설정.
        } else {
            result.setText("맛있는 배입니다.");
            result.setIcon(i2);
        }
    }
}
public class JLabelTest1 {
    public static void main(String[] args) {
        new JLabel1();
    }
}
cs



* 텍스트 클래스

  - 한 줄 : JTextField

  - 여러 줄 : JTextArea

  - [형식]

JTextField()

JTextField(int cols)

JTextField(String str, int cols)

JTextField(String str)

JTextArea()

JTextArea(String str)

JTextArea(int rows, int cols)

JTextArea(String str, int rows, int cols)

※ str : 생성될 때 나타낼 문자열.

   cols, rows : 텍스트 필드 또는 텍스트 에리어의 화면에서의 크기.

                입력되는 문자의 수와는 상관 없음.


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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
class JTFJTA1 extends JFrame implements ActionListener {
    JTextField jtf;  // 텍스트 객체 선언.
    JTextArea  jta;
    JLabel jl = new JLabel("입력하세요.");  // 라벨 객체 생성.
    public JTFJTA1() {
        jtf = new JTextField(20);
        jta = new JTextArea(1020);
        jta.setEditable(false);  // 텍스트 에리어 수정 불가 설정.
        
        Container ct = getContentPane();
        ct.setLayout(new FlowLayout());
        
        JPanel jp = new JPanel();  // 패널 객체 생성.
        jp.add(jtf);  // 패널에 추가.
        jp.add(jta);
        
        ct.add(jp);  // 컨테이너에 패널 추가.
        ct.add(jl);
        
        jtf.addActionListener(this);
        
        setTitle("JTextField, JTextArea Test1");
        setSize(500300);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ae) {
        if(jta.getLineCount() <= jta.getRows()) {
        // 텍스트의 크기(줄)보다 작을 때만 추가.
            jta.append(ae.getActionCommand()+"\n");
            jtf.setText("");  // 새로운 입력을 받기 위해, 기존의 내용을 비움.
        } else {
            jl.setText("입력이 종료되었습니다.");  // 크기를 넘어서면 라벨을 출력하고,
            jtf.setEditable(false);              // 텍스트 필드 수정 불가 설정.
        }
    }
}
public class JTFJTATest1 {
    public static void main(String[] args) {
        new JTFJTA1();
    }
}
cs




* JList 클래스

  - [형식]

JList()

JList(Object[] items)

※ items : 리스트로 생성할 배열.


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
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;  // 스윙 이벤트 패키지 포함.
 
class JList1 extends JFrame implements ListSelectionListener {
    private String[] fruitlist = {"persimmon""banana""apple""grape""cherry""pear"};  // 과일 이름 배열 생성.
    private JList jlst = new JList(fruitlist);  // 이름 배열로 리스트 객체 생성.
    private ImageIcon[] fruiticons = {  // 아이콘 객체 배열 생성.
            new ImageIcon("image/persimmon.jpg"),
            new ImageIcon("image/banana.jpg"),
            new ImageIcon("image/apple.jpg"),
            new ImageIcon("image/grape.jpg"),
            new ImageIcon("image/cherry.jpg"),
            new ImageIcon("image/pear.jpg")
    };
    private JLabel[] jlicon = new JLabel[6];  // 아이콘을 위한 라벨 객체 배열 생성.
    private JLabel jlname = new JLabel();  // 라벨을 저장할 객체 생성.
    
    public JList1() {
        Container ct = getContentPane();
        
        JPanel jp1 = new JPanel();
        jp1.setLayout(new GridLayout(3,2,5,5));  // 아이콘 패널 Grid 배치 관리자 설정.
        for (int i=0; i<6; i++) {
            jp1.add(jlicon[i] = new JLabel());
        }
        
        JPanel jp2 = new JPanel();
        jp2.add(jlname);
        ct.add(jlst, BorderLayout.WEST);  // Border 배치 관리자로 설정.
        ct.add(jp1, BorderLayout.CENTER);
        ct.add(jp2, BorderLayout.EAST);
        
        jlst.addListSelectionListener(this);  // 리스트에 리스너 등록.
        
        setTitle("JList Test1");
        setSize(700300);
        setVisible(true);
    }
    public void valueChanged(ListSelectionEvent lse) {
        for (int i=1; i<6; i++) {  // 아이콘을 모두 삭제.
            jlicon[i].setIcon(null);
        }
        int[] indices = jlst.getSelectedIndices();  // 선택된 항목을 배열로 추출.
        String s = "당신이 선택한 항목은 : ";
        for (int j=0; j<indices.length; j++) {  // 선택된 아이콘을 표시.
            jlicon[j].setIcon(fruiticons[indices[j]]);
            s = s + fruitlist[indices[j]] + " ";  // 선택된 아이콘의 문자열을 생성.
        }
        jlname.setText(s);  // 선택한 아이콘의 문자열 표시.
    }
}
public class JListTest1 {
    public static void main(String[] args) {
        new JList1();
    }
}
cs




수고하셨습니다.



+ Recent posts