2017-01-28 8 views

ответ

2

Вы можете хранить последнюю выбранную строку и проверить с слушателя мыши на сцене, если щелчок был на выбранной строке или где-нибудь еще:

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

большое спасибо за ваш ответ, но я получаю исключения нулевого указателя в строке stage.getScene(). addEventFilter (MouseEvent.MOUSE_CLICKED, new EventHandler () { –

+0

Если у вас есть доступ к объекту 'scene', просто замените' stage.getScene() 'в приведенном выше коде символом' scene'. В противном случае взгляните на этот вопрос: http://stackoverflow.com/questions/30464238/javafx-getscene-returns-null – user7291698

+1

да, у меня также был доступ к сцене. Сейчас он работает нормально. большое спасибо –

2

Вы можете добавить фильтр событий для Scene, который использует модель выбора в TableView, чтобы очистить выбор, если щелчок был на пустой строке или в любом месте за пределами TableView:

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

 Смежные вопросы

  • Нет связанных вопросов^_^