2015-09-06 40 views
-2

我使用JavaFX的工作,并试图解决以下问题:JavaFX的,如何与多个tableviews和他们的项目选择工作

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

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

我尝试使用tableview.getSelectionModel().clearSelection() 并添加鼠标点击侦听器以取消选择其他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

您可以创建并发布[MCVE](http://stackoverflow.com/help/mcve)吗?在没有看到导致它的代码的情况下,知道什么可能会出错是几乎不可能的。 –

+0

@James_D好吧,现在它应该足够的上下文 – qecce

+0

他们是tableviews而不是listviews对不对?纠正你的问题。 –

回答

1

IMO,问题是当你点击第二个tableview,你在1号叫clearSelection()。所以这clearSelection()再次触发selectedItemProperty()更改事件在第1个tableview。

而不是添加鼠标按下事件处理程序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); 
    }); 

然后取出鼠标处理程序。

+0

谢谢。 现在它比以前好,但不像我想要的那样工作。 是A上的创建项目,B上的信息显示正确,当我先点击A项目然后点击B项目时。 但是当我点击B到A项目时,只显示B项目informatin(所以没有更新)。这只适用于创建另一个A项目,点击这个新项目然后点击旧项目。现在值正确显示。奇怪的行为。 – qecce

+0

@qecce - 最可能没有什么奇怪的本身,只是你没有显示的代码错了;-) – kleopatra

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

那是什么几乎BIY Uluk发布。谢谢!