JavaFX,如何使用多个tableviews及其项目选择

时间:2015-09-06 22:12:10

标签: java javafx javafx-8

我正在使用JavaFx并尝试解决以下问题:

我有2个TableViews(A和B)(每个只有一列)。如果我选择一个tableview项,则应该在其他地方有关于所选对象的信息监听。

当我选择tableview A并单击某个项目时,将显示信息并选择该项目。没关系。 现在,当我尝试选择tableview B项时,信息不会显示。它只适用于我第一次点击tableview一个区域(不点击A的直接项目)然后点击tableview B项目。可能是什么原因?

我试过tableview.getSelectionModel().clearSelection() 并添加mouseclick监听器以取消选择其他tableview。没工作。

也许有一种简单的方法可以说“忘记之前的所有选择”?谢谢!

以下代码显示点击发生时的信息:

.... 
initTableConfiguration();
categoryTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) ->  showBoardObjectDetails(newValue));  
noteTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) ->  showBoardObjectDetails(newValue));}


private void initTableConfiguration() {     
    categoryColumn.setCellValueFactory(
            cellData -> cellData.getValue().titleProperty());
    noteColumn.setCellValueFactory(
            cellData -> cellData.getValue().titleProperty());
}

点击的听众:

categoryTableView.setOnMousePressed(new EventHandler<MouseEvent>(){
        @Override
        public void handle(MouseEvent me){          
            noteTableView.getSelectionModel().clearSelection();     

        }
    });
noteTableView.setOnMousePressed(new EventHandler<MouseEvent>(){
        @Override
        public void handle(MouseEvent me){
            categoryTableView.getSelectionModel().clearSelection();

        }
    });

显示信息:

public void showBoardObjectDetails(Object object){
    if(object != null){
        Category category;
        Note note;
        if(object.getClass()==Category.class){
            category = (Category) object;
            titleLabel.setText(category.getTitle());                
            dateLabel.setVisible(false);    
            staticDateLabel.setVisible(false);
            contentTextArea.setVisible(false);
            staticContentLabel.setVisible(false);
        }else if(object.getClass()==Note.class){
            note = (Note) object;
            staticContentLabel.setVisible(true);
            staticDateLabel.setVisible(true);
            dateLabel.setVisible(true);
            contentTextArea.setVisible(true);
            titleLabel.setText(note.getTitle());            
            dateLabel.setText(note.getDate().toString());           
            contentTextArea.setText(note.getText());
        }
    }else{
        titleLabel.setText("");
        dateLabel.setText("");
        contentTextArea.setText("");
    }
}

2 个答案:

答案 0 :(得分:1)

IMO,问题是当您点击第二个表视图时,您在第一个时间调用clearSelection()。因此,此clearSelection()再次触发selectedItemProperty()更改了第一个表视图上的事件。

不要将鼠标按下的事件处理程序添加到tableviews,而是尝试使用

categoryTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) ->  {
                   noteTableView.getSelectionModel().clearSelection();
                   showBoardObjectDetails(newValue);
     } );

noteTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) ->  {
                   categoryTableView.getSelectionModel().clearSelection();
                   showBoardObjectDetails(newValue);
     } );

然后删除鼠标处理程序。

答案 1 :(得分:0)

现在它可以使用以下内容:

categoryTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) -> {                       
             if(newValue !=null){
                 noteTableView.getSelectionModel().clearSelection();
                 showBoardObjectDetails(newValue);
             }                           
         });  

    noteTableView.getSelectionModel().selectedItemProperty().addListener(
         (observable, oldValue, newValue) -> {                       
             if(newValue !=null){
                 categoryTableView.getSelectionModel().clearSelection();
                 showBoardObjectDetails(newValue);                   
             }              
         });

这几乎是Uluk Biy发布的内容。谢谢!