2017-09-19 148 views
0

我有兩個控件在我的JavaFX應用程序 1.文本字段 2. ListView控件如何在JavaFX中設置節點相對於另一個節點的位置?

我想放置的ListView只使用文本字段的座標的文本字段下方。 由於TextField的位置發生變化。

詳情:

我創建要求當用戶輸入文本字段的東西,就彈出一個列表,我的項目自動建議文本字段。該文本字段可能存在於場景中的任何位置,也可能位於另一個列表視圖中。所以我需要的是如何在屏幕上獲得文本字段的座標,以便我可以將列表視圖放置在文本字段的正下方。

+0

使用'VBox',或其他[佈局面板(http://docs.oracle.com/javase/8/javafx/layout-tutorial/builtin_layouts.htm#JFXLY102)即達到你所需要的 –

+0

@James_D謝謝您的回覆......請參閱編輯(我已添加了當前場景的一些詳細信息)。 – AshutoshSurya007

+0

根據您的具體使用情況下,這也許就是一個重複:https://stackoverflow.com/q/36861056/3795043 – findusl

回答

0

我在這裏看到多個選項:

  • 我想你可能是用ContextMenu的更好。當你顯示一個ContextMenu時,你可以定義一個視圖,它應該相對於視圖的一側顯示出來。

  • 如果一個ContextMenu不能滿足你的要求,我有最簡單的想法是,你有VBox和輸入TextField並在VBoxListView取代你TextField。這將使他們在一起,你可以像定位你的TextField那樣定位VBox

  • ,如果你想展示出來自己最後的文本字段包含了諸如layoutXlayoutYheightwidth屬性。使用那些你可以計算出ListView的位置(例如,ListView的Y位置是textField.layoutY + textField.height)。爲了保持這一立場是最新的我看到兩個選項:

    • 要定位TextField你有可能改寫一些ParentlayoutChildrens方法,所以你也許可以把這個代碼在那裏。
    • 如果沒有,你也可以註冊這些屬性ChangeListeners當他們改變得到通知,並相應地重新定位你的ListView。
+0

'layoutX'和'layoutY'不會給你的文本字段的屏幕座標,雖然。 –

+0

非常感謝...我認爲ChangeListeners會爲我工作..:D – AshutoshSurya007

+0

@James_D是真的,但我不明白爲什麼他首先需要屏幕座標,所以我沒有用localToScreen轉換解決方案。 – findusl

0

要獲取屏幕座標的文本字段的位置,你可以做

Bounds boundsInScreen = textField.localToScreen(textField.getBoundsInLocal()); 

這會返回一個Bounds對象,從中可以得到各種座標,例如

Popup popup = ... ; 
popup.setWidth(boundsInScreen.getWidth()); 
popup.show(textField, boundsInScreen.getMinX(), boundsInScreen.getMaxY()); 
相關問題