JavaFX | ListView와 SelectionModel | ListView의 클릭 이벤트 처리

ListView에 표시된 항목을 클릭하여 어떤 처리을 수행 시키고자 하는 같은 경우에는 어떻게 해야 할까? ListView에는 액션 이벤트가 제공되어 있는다. 그러므로 클릭하면 뭔가를 행하도록 다른 이벤트를 준비해야 한다.

여기에서는 “MouseClick"라는 이벤트를 이용해 보자. 이것은 이름에서 알수 있듯이 마우스로 클릭했을 때 발생하는 이벤트이다. 이 이벤트는 “setOnMouseClicked ‘라는 메소드를 사용하여 설정할 수 있다.

listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        // 수행할 처리
    }
});

이런식으로 작성을 하면 된다. 그러나 Java8에서는 이러한 이벤트의 기본은 람다 식을 사용하는 것이 기본이기 때문에, 일반적으로 다음과 같이 작성하게 될 것이다.

listView.setOnMouseClicked ((MouseEvent) -> {
    // 수행할 처리
}

이쪽이 매우 간단하다. 그럼 실제 사용 예제를 만들어 보자. 아래와 같이 리스트의 항목을 클릭하면 해당 텍스트를 Label1에 표시하는 예제이다. setOnMouseClicked를 이용하면 간단한 리스트의 항목을 클릭한 처리를 추가할 수 있다.

package com.devkuma.javafx;
 
import java.net.URL;
import java.util.ResourceBundle;
 
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
 
 
public class AppController implements Initializable {
    @FXML Label label1;
    @FXML ListView<String> list1;
    @FXML Button btn1;
     
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        list1.setItems(FXCollections.observableArrayList());
        list1.getItems().add("One");
        list1.getItems().add("Two");
        list1.getItems().add("Three");
         
        list1.setOnMouseClicked((MouseEvent)->{
            Object obj = list1.getSelectionModel().getSelectedItem();
            label1.setText(obj.toString());
        });
 
        btn1.setOnAction((AtionEvent)->{
            String obj = list1.getSelectionModel().getSelectedItem();
            label1.setText("you selected: \"" + obj + "\".");
        });
    }
 
}

ListView에서 항목을 선택했을 때의 이벤트 처리를 하려면, 사실 MouseClick는 최적은 아니다. 이 후에 설명하는 ChangeListener를 사용하는 편이 더 나은 것이다.