티스토리 뷰

TableView Select 두번 시 해제하기

  이번 시간에는 JavaFX TableView의 Select 된 row를 한번더 Select 했을 때 해제 하는 방법을 알아보겠습니다. 뭔 소린지 이해가 가지 않으실 것 같아서 결과화면을 미리 준비했습니다. TableVeiw 사용법은 이전 포스트 를 참고 하시면 됩니다. 




 ■ 예상 결과






  위 사진 처럼 TableRow가 Select 되었는데 다시 한번 클릭 한 경우 Select 가 해제 되는 기능을 구현해볼 것 입니다. 어렵지 않습니다.



 ■ Controller



 일단 어떤 방법으로 해결할지 생각해 볼까요? 테이블의 Row에 이벤트가 발생할 때 oldValue와 newValue와 비교를 해서 같으면 Select를 해제 하는 방법으로 해결하면 될 것입니다. 그렇다면 리스너를 달아야겠네요.



 테이블뷰에 리스너를 다는 방법 중의 정석은 selectedItemProperty에 addHandler를 하는 방법이겠지만 아래 코드를 사용하게 되면 문제가 있습니다. 


1
2
3
4
5
6
myTableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TableRowDataModel>() {
            @Override
            public void changed(ObservableValue<extends TableRowDataModel> observable, TableRowDataModel oldValue, TableRowDataModel newValue) {
                //oldVlue와 newValue를 사용할 수 있지만 Select된 Row가 다시 눌리는 이벤트는 받지 못한다..
            }
        });
cs


 주석에도 설명 되었듯이 새롭게 Select된 Item에만 이벤트가 발생한다는 문제가 발생합니다. 그럼 사용하지를 못하겠죠.



 이를 해결하기 위한 방법을 살펴보죠. 컨트롤러에 있는 tableView에 아래 코드를 추가하시면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Object oldValue;
//Select 된 이전 값을 저장하기 위한 변수
 
myTableView.setOnMouseClicked(event -> {
            if(myTableView.getSelectionModel().getSelectedItem() != null) {
                if (event.getPickResult().getIntersectedNode().equals(oldValue)) {
                    myTableView.getSelectionModel().clearSelection();
                    oldValue = null;
                } else {
                    oldValue = event.getPickResult().getIntersectedNode();
                }
            }
        });
 
cs


  원리는 간단합니다. 이전에 Select된 값을 저장하기 위한 oldValue Object 변수를 선언하고 tableView에 클릭 이벤트가 발생할 때 oldValue와 새로 들어온 node Value가 같은지 검사하고 같으면 Selection 을 Clear하고 그렇지 않으면 oldValue에 값만 저장하는 원리 입니다.  


 다음 시간에는 좀 더 복잡한 다중 Selection을 구현하는 방법을 알아보겠습니다. 봐주셔서 감사합니다 :)


반응형
댓글