我正在使用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("");
}
}
答案 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发布的内容。谢谢!