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();
	}
}







+ Recent posts