2017-01-28 48 views
5

satırındaki boş satırlara tıklandığında bazı satırlarla TableView var. Kullanıcı herhangi bir satırı seçebilir, ancak boş satırlara veya Stage üzerindeki herhangi bir yere tıkladığında, TableView geçerli seçimini silmek istiyorum.Temizle Seçimi javafx

cevap

2

yapabilirsiniz son seçilen satırı saklamak ve tıklama başka bir yere seçili satır veya üzerinde ise sahnede bir fare dinleyici ile kontrol edin: Cevabınız için

ObjectProperty<TableRow<MyRowClass>> lastSelectedRow = new SimpleObjectProperty<>(); 

    myTableView.setRowFactory(tableView -> { 
     TableRow<MyRowClass> row = new TableRow<MyRowClass>(); 

     row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
      if (isNowSelected) { 
       lastSelectedRow.set(row); 
      } 
     }); 
     return row; 
    }); 


    stage.getScene().addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      if (lastSelectedRow.get() != null) { 
       Bounds boundsOfSelectedRow = lastSelectedRow.get().localToScene(lastSelectedRow.get().getLayoutBounds()); 
       if (boundsOfSelectedRow.contains(event.getSceneX(), event.getSceneY()) == false) { 
        myTableView.getSelectionModel().clearSelection(); 
       } 
      } 
     } 
    }); 
+0

çok teşekkürler ama ben çizgi de boş işaretçi istisna alıyorum stage.getScene(). addEventFilter (MouseEvent.MOUSE_CLICKED, yeni EventHandler () { –

+0

"Sahne" nesnesine erişiminiz varsa, yukarıdaki sahnedeki stage.getScene() işlevini 'scene' ile değiştirin. Aksi halde şu soruya bir göz atın: http://stackoverflow.com/questions/30464238/javafx-getscene-returns-null – user7291698

+1

evet sahneye erişimim vardı. Şimdi iyi çalışıyor. Çok teşekkürler –

2

tıklama boş satırda oldu veya herhangi TableView bir dış varsa, seçimi temizlemek için TableView seçimi modeli kullanır Scene bir olay filtre ekleyebilirsiniz:

scene.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> { 
    Node source = evt.getPickResult().getIntersectedNode(); 

    // move up through the node hierarchy until a TableRow or scene root is found 
    while (source != null && !(source instanceof TableRow)) { 
     source = source.getParent(); 
    } 


    // clear selection on click anywhere but on a filled row 
    if (source == null || (source instanceof TableRow && ((TableRow) source).isEmpty())) { 
     tableView.getSelectionModel().clearSelection(); 
    } 
});