2015-09-06 15 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發佈。謝謝!

相關問題