프로그래밍 언어/JAVA

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

· 코딩마이데이

JList<E>

JList<E>는 여러 개의 아이템을 리스트 형식으로 보여주고 아이템을 선택하도록 하는 리스트 컴포넌트를 구현합니다. JDK7부터 JList에 제네릭(Generic)을 도입하여 JList<E>(이하 JList 또는 리스트)로 사용합니다. E는 리스트에 삽입하는 아이템의 타입으로, 리스트를 생성할 때 E 대신 아이템 타입을 대입하여 구체화해야 합니다. 문자열과 이미지가 아이템으로 사용 가능하며, 사용자는 하나 이상의 아이템을 선택할 수 있습니다.JList<E>는 자체적으로 스크롤을 지원하지 않기 때문에 JScrollPane에 삽입되어야 스크롤이 가능합니다.

 

JList<E> 리스트 생성과 특징

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

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

 

객체 배열로부터 리스트 생성

JList<E>는 스크롤을 지원하지 않기 때문에 ScrollPane에 삽입하면 스크롤이 가능합니다.

 

리스트 만들기

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.png"),
            new ImageIcon("images/icon3.png"),
            new ImageIcon("images/icon4.png") };


    public ListEx() {
        setTitle("리스트 만들기 예제");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());

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

        JList<ImageIcon> imageList = new JList<ImageIcon>(); // 이미지 리스트 생성
        imageList.setListData(images);
        c.add(imageList);

        JList<String> scrollList = new JList<>(fruits); // 문지열 리스트 생성
        c.add(new JScrollPane(scrollList)); // 리스트를 JScrillPane에 부착

        setSize(300, 300);
        setVisible(true);
    }

    public static void main(String[] args) {
        new ListEx();
    }
}

 

[실행 결과]

 

 

리스트의 아이템 변경

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

Vector<String> v = new Vector<String>();
v.add("황기태");
v.add("이재문");
JList<String> nameList = new JList<String>(v);

 

벡터 v에 추가한 후 setListData(v)를 호출하여 벡터 v를 리스트에 다시 연결하면 됩니다.

v.add("김남윤");
nameList.setListData(v);

 

리스트의 아이템 변경

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

public class ListChangeEx extends JFrame {
    private JTextField tf = new JTextField(10);
    private Vector<String> v = new Vector<>();
    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()); // 벡터 v에 입력된 이름 추가
                t.setText("");
                nameList.setListData(v); // 벡터 vdp 입력된 모든 이름으로 리스트 새로 만들기
            }
        });
    }

    public static void main(String[] args) {
        new ListChangeEx();
    }
}

 

[실행 결과]