2017-06-09 21 views
0

所以這是我的問題。我在我的控制器的初始化(URL,ResourceBundle)函數中有以下代碼。當我點擊某一行時,setOnMouseClicked將被正確調用,但setOnKeyPressed不會。我在這裏錯過了什麼?TableRow不使用setOnKeyPressed

tblView.setRowFactory(tv -> { 
    TableRow<Entry> row = new TableRow<Entry>(); 

    row.setOnMouseClicked((MouseEvent e) -> { 
     if ((!row.isEmpty()) && (e.getButton() == MouseButton.PRIMARY) && (e.getClickCount() == 2)) { 
      openEntryEditor(row); 
      e.consume(); 
     } 
    }); 

    row.setOnKeyPressed((KeyEvent e) -> { 
     if ((!row.isEmpty()) && (e.getCode() == KeyCode.ENTER)) { 
      openEntryEditor(row); 
      e.consume(); 
     } 
    }); 

    return row; 
}); 

回答

2

目標節點。這意味着只有重點節點和它的祖先接收事件。

然而,無論您點擊哪個部分,始終都有關注TableView。因此,作爲TableView的後裔添加的TableRow未收到該事件。

您需要在TableView上註冊該聽衆並使用SelectionModel來檢索所需的信息。

tableView.setOnKeyPressed((KeyEvent e) -> { 

    if (!tableView.getSelectionModel().isEmpty() 
      && e.getCode() == KeyCode.ENTER) { 

     System.out.println("edit " + tableView.getSelectionModel().getSelectedItem()); 

     e.consume(); 
    } 
}); 
+0

有趣。我被Gui誤導了:P。我認爲TableRow具有焦點,因爲它被點擊或移動到箭頭鍵時突出顯示。 – user9985

0

KeyEvent s是聚焦Node通常我這個勾上表中沒有的行...

tblView.setOnKeyReleased(event -> { 
      if(event.getCode().equals(KeyCode.ENTER) || event.getCode().equals(KeyCode.SPACE)){ 
       if(tblView.getSelectionModel().getSelectedItem() != null) { 
        //Do your stuff 
       } 
      } 
     });