2016-05-06 41 views
1

我有一個可編輯的JavaFX 8中的TableView。其中一個字段是CheckBoxTableCell。阻止TAB登陸JavaFX中的CheckBoxTableCell 8

我注意到TAB鍵落在網格中的第一個CheckBoxTableCell上,並卡在那裏。我不想要這種行爲。我喜歡用鍵盤導航到單元格,並用SPACE激活。不過,我需要標籤忽略此字段 - 因爲它卡住了。

我試過如下:

booleanColumn.setCellFactory (to -> { 
    CheckBoxTableCell<DTO, Boolean> cell = CheckBoxTableCell<>(); 
    cell.setFocusTraversable(false); 
    return cell; 
} 

然而這在球場上的焦點沒有影響,因爲它是可編輯的,它的土地上控制和被卡住。

如果我更改爲:

cell.setDisable(true); 

然後TAB將跳過該領域,但我可以用方向鍵列降落。不過,我不能用鼠標選擇複選框。

我不知道該怎麼做。

感謝。

回答

3

解決方法使TAB鍵首先工作意味着消耗事件,以便默認的TableView遍歷引擎不處理它,並選擇下一個或上一個單元格。

這將從細胞移動選擇單元格:

table.getSelectionModel().setCellSelectionEnabled(true); 

table.setOnKeyPressed(keyEvent -> { 
    switch (keyEvent.getCode()){ 
     case TAB: { 
      keyEvent.consume(); 
      if (keyEvent.isShiftDown()) { 
       personTable.getSelectionModel().selectPrevious(); 
      } else { 
       personTable.getSelectionModel().selectNext(); 
      } 
      break; 
     } 
    } 
}); 

但它不會是足以讓CheckBox集中,和space密鑰不能被用來選擇它。因此,需要第二步將焦點從所選單元格移動到內部複選框。

當單元格獲得焦點時,其節點將請求它。

booleanColumn.setCellFactory (param -> { 
    CheckBoxTableCell<DTO, Boolean> cell = new CheckBoxTableCell<>(); 
    cell.focusedProperty().addListener((obs, ov, nv) -> { 
     if (nv && cell.getGraphic() != null) { 
      cell.getGraphic().requestFocus(); 
     } 
    }); 
    return cell; 
}); 

注意你不能兼得的細胞和它的複選框集中在同一時間,所以細胞將顯示爲灰色(選擇,但不集中),除非你修改它的CSS。

+0

謝謝@Jose,但是這個解決方案不適合我的需求。隨着屏幕上的許多控件,然後我需要有選項卡導航控件。我們正在使用箭頭鍵導航表格,並聽取擊鍵以開始編輯。當我執行此修復程序時,我失去了從控制到控制的導航。 Shift Tab也停在該行的第一個單元格,它看起來不會移動到前一行。我真的很想阻止CheckBoxTableCell獲得焦點。我已經處理了空格鍵激活以在單元格具有焦點時選擇它。 –

+0

只有在表獲得用於導航單元格的焦點時,仍然可以使用Tab鍵導航控件。如果您不使用選項卡事件,則仍然可以使用箭頭鍵導航單元格。 –

+0

我是你的建議,它不允許焦點遍歷屏幕上的下一個控件。你有什麼建議嗎?當我刪除事件中的消耗時,SHIFT + TAB在最後一行將我帶到先前的控件,但它不會將我帶到下一個控件。我發現行爲有點奇怪。大多數表沒有CheckBoxTableCells,所以我更喜歡用箭頭鍵而不是製表符的一致行爲。我會看到關於手動跳過控制,除非你有更好的方法? –