2015-01-12 14 views
1

我想彈出一個相對於TableView中選定行的節點。我們遵循的用戶界面使用編輯按鈕來打開彈出窗口,我想將它放在行的上面或行的上面,這取決於TableView中的行的位置。我如何確定JavaFX中TableView中某一行的X和Y座標8

我似乎無法找到一種方法來找到行的X & Y座標,而無需單擊該行。

由於我的應用程序需要全鍵盤導航,因此我需要能夠從選定的行中確定該位置,即使它是通過鍵盤選擇的。

I.e.像這樣

myTableView.getSelectionModel().getSelectedItem().location() or something like that. 

我已經看過了幾個例子在這裏,但沒有一個似乎提供關於如何根據點擊屏幕上的其他地方得到的座標足夠的細節。

謝謝!

+0

當你說X和Y座標時,是指對應於場景或屏幕內像素位置的(x,y)對嗎?或者你指的是x,y座標,因爲它們在矩陣內? (又名:表),在這種情況下,你想要單元格的位置還是行的位置?在討論整行時x座標沒有什麼意義(假設x在水平方向上)... – WillBD

+0

我想要X,Y座標相對於表格所在的屏幕。這樣我就可以確定行的起始位置(如果表格沒有留在屏幕上),以及它與屏幕大小的關係。這樣我可以將覆蓋圖放在當前所選行下方的表格左側。希望有所幫助。 –

回答

1

你可以做這些方針的東西:如果沒有行已選擇在任何時間lastSelectedRow.get()

TableView<T> table = ... ; 

ObjectProperty<TableRow<T>> lastSelectedRow = new SimpleObjectProperty<>(); 
table.setRowFactory(tableView -> { 
    TableRow<T> row = new TableRow<T>(); 
    row.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
     if (isNowSelected) { 
      lastSelectedRow.set(row); 
     } 
    } 
    return row ; 
}); 

然後將返回代表選擇的最後一行的實際節點,或null(目前執行的TableView下的行爲,我不認爲這會發生)。然後,您可以使用各種getBoundsIn*()方法,或許與localTo*()相結合的方法,當你需要它來獲得行的位置:例如

TableRow<?> row = lastSelectedRow.get(); 
Bounds bounds = row.localToScreen(row.getBoundsInLocal()); 

會給選擇的最後一行的相對於屏幕座標的範圍。

如果用戶使用鼠標選擇某些內容,然後將選定的行從視圖中滾動出來,可能會發生奇怪的事情;但是然後你需要弄清楚如何處理,但是你得到的座標。

+0

必須將行'selectedRow.set(row);' 'lastSelectedRow.set();' ? – Inge

+0

是的,抱歉;我改變了它,因爲它不是第一種方法,也沒有更新那條線。現在修復。 –