▶ JList
- 여러 개의 선택 항목 중에서 하나를 선택하기 위한 컴포넌트
- 리스트는 한 줄에 하나씩 선택 항목을 나타내며 화면은 스크롤이 가능하다.
- 사용자가 마우스로 선택한 항목을 더블 클릭하거나 엔터 키를 눌렀을 때 액션 이벤트가 발생한다.
- 생성자의 매개변수로 받을 ListModel은 디폴트일 경우 변경이 불가하여, 리스트에 항목을 추가하거나 삭제할 수 없다.
- 개별적으로 변경될 수 있는 리스트를 생성하기 위해서는 리스트 모델을 DefaultListModel의 인스턴스로 변경하여야 한다. 이는 setModel() 메소드를 호출함으로서 가능하다.
생성자 |
JList() |
빈 리스트를 생성한다. |
JList(Object[] items) |
매개변수로 받은 배열에 있는 값들을 가진 리스트를 생성한다. |
JList(ListModel list) |
지정된 리스트 모델을 사용하는 리스트를 생성한다. |
JList(Vector[] items) | 벡터에 있는 값들을 가지고 선택항목을 생성한다. |
- 선택 모드 : 디폴트값은 다중 구간 선택이다.
SINGLE_SELECTION : 단일 선택으로, 한 번에 하나의 항목만이 선택된다.
SINGLE_INTERVAL_SELECTION : 단일 구간 선택으로, 여러 개의 연속적인 항목들이 선택될 수 있다. 처음 클릭한 항목에서 쉬프트 키(Shift)를 누른 채로 원하는 범위의 항목(마지막 항목)까지 선택할 수 있다.
MULTIPLE_INTERVAL_SELECTION : 다중 구간 선택으로, 디폴트로 항목들이 자유롭게 선택될 수 있다. 연속적이지 않더라도 컨트롤 키(Ctrl)를 누른 채로 클릭하는 항목들은 모두 선택된다.
- 선택 모드를 변경하고 싶으면 setSelectionMode() 메소드를 호출하여 매개변수로 아래의 선택 모드 중 하나를 지정하면 된다.
ListSelectionModel.SINGLE_SELECTION
ListSelectionModel.SINGLE_INTERVAL_SELECTION
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION
String[] listStr= { “김철수”, “김영희”, “김숙자”, “김자몽” };
JList myList= new JList(listStr); //생성자로 선택항목을 넘기는 것이 가장 일반적인 방법
myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- 이벤트 처리 : 리스트의 항목이 선택되면 리스트 선택 이벤트(ListSelectionEvent)가 발생한다. 해당 이벤트를 처리하려면 리스트 선택 리스너(ListSelectionListener) 인터페이스를 구현함으로써 해결할 수 있다. 리스트 선택 리스너에는 아래의 메소드 하나만 구현하면 된다.
@Override
public void valueChanged(ListSelectionEvent e) {
if (list.getSelectedIndex() == -1) { //getSelectedIndex() : 선택한 항목 인덱스 값 반환
//선택이 되지 않은 경우
} else { //선택되지 않은 경우 –1을 반환한다.
//선택이 된 경우
}
if (list.getSelectedItem().equals(name) { //getSelectedItem() : 선택한 항목의 이름 반환
// 항목 이름이 name인 선택된 경우
} else {
// 선택되지 않았거나, 선택된 항목 이름이 name이 아닌 경우
}
if (list.getSelectedValue()!=null) { //getSelectedValue() : 선택된 항목(Object 타입) 반환
//하나라도 선택된 경우
} else {
//하나도 선택되지 않은 경우
}
}
- 경계선 만들기 : 다른 컴포넌트에도 있는 메소드이다. 숫자 1은 선의 굵기이다.
myList.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
- 화면에 표시되는 행 수 설정 : 스크롤 바 추가를 위해 행 수를 설정하는 것이 좋다.
listStr.setVisibleRowCount(10);
JScrollPane scrollPane = new JScrollPane(listStr);
scrollPane.setPreferredSize(new Dimension(300, 300)); //사이즈 설정
panel.add(scrollPane); //꼭 필요한 과정! 자주 까먹는 부분이니 주의바람.
- 리스트 항목 추가 : 디폴트 리스트 모델은 변경할 수 없기 때문에 새로운 DefaultListModel 인스턴스를 생성하여 생성자의 매개변수로 전달하여야 한다.
DefaultListModel model = new DefaultListModel();
model.addElement(“김철수”);
model.addElement(“김영희”);
model.addElement(“김숙자”);
model.addElement(“김자몽”);
JList myList = new JList(model);
//또는
JList myList = new JList();
myList.setModel(model);
- 리스트 항목 제거
int index = 2;
model.remove(index); //위의 순서에서 인덱스가 2인 “김숙자”가 리스트에서 삭제된다.
-리스트 항목 삽입
model.insertElementAt("김커피", 1); //인덱스 1인 "김영희" 위치에 "김커피" 삽입된다.
- JList 예제
public class ListTest extends JFrame implements addListSelectionListener{
//FIELDS
private JLabel = new JLabel();
private JTextField selectedList = new JTextField(10); //10글자까지 가능
private JPanel listPanel = new JPanel();
private JPanel labelPanel = new JPanel();
private JList list;
private JScrollPane scroll;
private String[] names = {"김철수", "김영희", "김숙자", "김자몽"};
//CONSTRUCTOR
public ListTest() {
setTitle("리스트 예제");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프레임을 껐을 때 완전한 종료
list = new JList(names);
//리스트의 경계선 설정
list.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
//리스트에 스크롤바 추가
scroll = new JScrollPane(list);
scroll.setPreferredSize(new Dimension(300, 300));
//리스트의 단일 선택 모드 변경
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//리스트 선택 리스너 등록
list.addListSelectionListener(this);
label.setText("선택된 항목 : ");
selectedList.setEditable(false); //텍스트 필드 수정 불가상태로 바꾸기
listPanel.add(scroll); //리스트를 패널에 추가
labelPanel.add(label); //라벨을 패널에 추가
labelPanel.add(selectedList); //텍스트 필드를 패널에 추가
add(listPanel, BorderLayout.CENTER); //프레임 중앙에 리스트를 배치
add(labelPanel, BorderLayout.SOUTH); //프레임 하단에 라벨과 텍스트 필드 배치
setVisible(true);
}
//METHODS
@Override
public void valueChanged(ListSelectionEvent e) {
// 선택된 이름 얻기
String name = (String) list.getSelectedValue();
selectedList.setText(name);
}
public static void main(String[] args) {
ListText listFrame = new ListTest();
}
}