본문 바로가기

프로그램언어/자바

스윙 컴포넌트의 공통 메소드4

JList<E>, 리스트 컴포넌트

JList<E> 는 여려 개의 아이템을 리스트 형식으로 보여주고 아이템을 선택하도록 하는 리스트 컴포넌트를 구현한다.

E는 리스트에 삽입된는 아이템의 타입으로, 리스트를 생성할 때 E 대신 아이템 타입을 대입하여 구체화해야 한다.

JList<E>는 자체적으로 스크롤을 지원하지 않기 때문에 JScrollPane에 삽입되어야 스크롤이 가능한다.

 

JList<E> 리스트 생성

리스트는 다음 생성자를 이용하여 생성한다.

JList<E>() 빈 리스트
JList<E>(Vector listData) 벡터로부터 아이템을 공급받는 리스트
JList<E>(Object [] listData) 배열로부터 아이템을 공급받는 리스트

 

리스트 만들기

다음 그림과 같이 3개의 리스트를 가진 프로그램을 작성하자.

 

import javax.swing.*;

import java.awt.*;

 

public class ListEx extends JFrame {

    private String [] fruits= {"apple", "banana", "kiwi", "mango", "pear",

                                    "peach", "berry", "strawberry", "blackberry"};

    private ImageIcon [] images = { new ImageIcon("images/icon1.png"),

    new ImageIcon("images/icon2.jpg"),

    new ImageIcon("images/icon3.jpg"),

    new ImageIcon("images/icon4.jpg") };


    public ListEx() {

        setTitle("리스트 만들기 예제");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

 

        JList<String> strList = new JList<String>(fruits); // 문자열 리스트 생성

        c.add(strList);

 

        JList<ImageIcon> imageList = new JList<ImageIcon>(); // 이미지 리스트 생성

        imageList.setListData(images);

        c.add(imageList);

 

        JList<String> scrollList = new JList<String>(fruits); // 문자열 리스트 생성

        c.add(new JScrollPane(scrollList)); // 리스트를 JScrollPane에 부착

 

        setSize(300,300);

        setVisible(true);

    }

 

    public static void main(String [] args) {

        new ListEx();

    }

}

 

리스트의 아이템 변경

생성된 리스트를 수정하는 가장 간단한 방법은 JList의 setListData() 메소드를 호출하여 리스트에 수정된 벡터나 배열을 새로 달아주는 것이다.

 

리스트 생성

Vector<String> v = new Vector<String>();
v.add("Java");
v.add("C언어");
JList<String> nameList = new JList<String>(v);

리스트 생성후 추가

v.add("C#");
nameList.setListData(v);

 

텍스트필드 창을 만들고 이곳에 이름을 입력하고 <Enter> 키를 입력하면 입력된 이름을 리스트 창에 출력하는 프로그램을 작성하자.

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.*;

 

public class ListChangeEx extends JFrame {

    private JTextField tf = new JTextField(10);

    private Vector<String> v = new Vector<String>();

    private JList<String> nameList = new JList<String>(v);

 

    public ListChangeEx() {

        setTitle("리스트 변경 예제");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

 

        c.add(new JLabel("이름 입력 후 <Enter> 키"));

        c.add(tf);

 

        v.add("홍길동");

        v.add("일지매");

        nameList.setVisibleRowCount(5); // 리스트가 보여주는 행의 수

        nameList.setFixedCellWidth(100); // 리스트의 폭

        c.add(new JScrollPane(nameList));

 

        setSize(300,300);

        setVisible(true);

 

        // JTextField에 ActionLister 등록. <Enter> 키 처리

        tf.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                JTextField t = (JTextField)e.getSource();

                v.add(t.getText());

                t.setText("");

                nameList.setListData(v);

            }

        });

    }

 

    public static void main(String [] args) {

        new ListChangeEx();

    }

}

 

JComboBox<E> 콤보박스 컴포넌트

JComboBox<E> 컴포넌트의 생성

콤보박스 컴포넌트는 다음 생성자를 이용하여 생성한다.

JComboBox<E>() 빈 콤보박스
JComboBox<E>(Vector listData) 벡터로부터 아이템을 공급받는 콤보박스
JComboBox<E>(Object [] listData) 배열로부투 아이템을 공급받는 콤보박스

 

배열로부터 콤보박스 생성

String [] fruits = {"apple", "bannana", "pear", "strawberry", "kiwi"};
JComboBox<String> strCombo = new JComboBox<String>(fruits);

콤보박스에 동적으로 아이템 추가하기

String [] fruits = {"apple", "bannana", "pear", "strawberry", "kiwi"};
JComboBox<String> strCombo = new JComboBox<String>();
for(int i=0; i<fruits.length; i++)
    strCombo.addItem(names[i]);

콤보박스 컴포넌트의 아이템 삭제하기

strCombo.removeItemAt(2);  // 3번째 아이템 삭제

 

다음 그림과 같은 두 개의 콤보박스를 만들어라.

왼쪽 콤보박스는 배열로부터 아이템을 공급받고, 오른쪽 콤보박스는 빈 콤보박스에서 addItem()메소드를 이용하여 아이템을 추가하라.

 

import javax.swing.*;

import java.awt.*;

 

public class ComboBoxEx extends JFrame {

    private String [] fruits = {"apple", "banana", "kiwi", "mango", "pear",

                                      "peach", "berry", "strawberry", "blackberry"};

    private String [] names = {"kitae", "jaemoon", "hyosoo", "namyun"};

 

    public ComboBoxEx() {

        setTitle("콤보박스 만들기 예제");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

 

        JComboBox<String> strCombo = new JComboBox<String>(fruits); // 문자열 콤보박스 생성

        c.add(strCombo);

 

        JComboBox<String> nameCombo = new JComboBox<String>(); // 콤보박스 생성

        for(int i=0; i<names.length; i++)

            nameCombo.addItem(names[i]); // 콤보박스에 문자열 아이템 삽입

 

        c.add(nameCombo);

        setSize(300,300);

        setVisible(true);

    }

 

    public static void main(String [] args) {

        new ComboBoxEx();

    }

}

 

JComboBox<E>와 Action 이벤트

int getSelectedIndex( ) 선택 상태인 아이템의 인덱스 번호를 리턴한다.
Object getSelectedItem( ) 선택 상태인 아이템 객체의 레퍼런스를 리턴한다.

 

Action 이벤트를 이용한 콤보박스 활용예

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

 

public class ComboActionEx extends JFrame {

    private String [] fruits = {"apple", "banana", "kiwi", "mango"}; // 콤보박스의 아이템

    private ImageIcon [] images = { // 이미지 객체 배열

        new ImageIcon("images/apple.jpg"),

        new ImageIcon("images/banana.jpg"),

        new ImageIcon("images/kiwi.jpg"),

        new ImageIcon("images/mango.jpg")};

    private JLabel imgLabel = new JLabel(images[0]); // 이미지 레이블 컴포넌트

    private JComboBox<String> strCombo = new JComboBox<String>(fruits); // 문자열 콤보박스

 

    public ComboActionEx() {

        setTitle("콤보박스 활용 예제");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

        c.add(strCombo);

        c.add(imgLabel);

 

        // Action 리스너 등록

        strCombo.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                JComboBox<String> cb = (JComboBox<String>)e.getSource(); // Action 이벤트가 발생한 콤보박스 알아내기

                int index = cb.getSelectedIndex(); // 콤보박스의 선택된 아이템의 인덱스 번호 알아내기

                imgLabel.setIcon(images[index]); // 인덱스의 이미지를 이미지 레이블 컴포넌트에 출력

            }

        });

 

        setSize(300,250);

        setVisible(true);

    }

 

    public static void main(String [] args) {

        new ComboActionEx();

    }

}