2016-05-12 275 views
0

我看到一些奇怪的行爲,其中javafx.scene.control.TextField的首選寬度在調用setPrefColumnCount後未被正確計算。我的具體使用案例是針對javafx.scene.control.Spinner控件。我的代碼如下:JavaFX TextField.setPrefColumnCount()不起作用

@FXML 
private Spinner<Integer> mySpinner; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    mySpinner.getEditor().setPrefColumnCount(3); 
} 

執行上面之後,我得到一個微調是勉強足夠大的單個字符(微調值在999如圖):

Incorrectly Sized Spinner

有沒有人知道基於我想要顯示的位數來設置TextField的寬度的正確方法?我在Windows 7 Enterprise SP1 x64上使用JRE 8u77,以防萬一。

編輯

我已經意識到了問題的一部分是,即使我通過測量說明here的文字,我仍然不知道如何設置Spinner.prefWidth來。另外,看起來在底層的TextField編輯器上設置prefWidth與將其設置在Spinner對象上沒有區別。有什麼方法可以獲得TextField.padding屬性(在initialize方法中返回0,即使它最終在每邊都設置爲7)?如何查詢向上/向下箭頭的寬度?如果我能以某種方式計算/查詢這些值,那麼我可以使用度量文本技術。然而,如果沒有這些信息,我無法弄清楚如何去做。

+0

該屬性從來沒有爲我工作,無論是。我通過使用不同的方法來確定相對顯示比例。我創建了一個類似於css中的em值的變量。 'final static double em = Math.print(new Text(「」)。getLayoutBounds()。getHeight());'然後我通過使用乘數將它用作相對寬度和高度的基礎。 'navButtons.setButtonMinWidth(5 * em);' – RonSiven

+0

我試圖做一些基於[測量文本](http://stackoverflow.com/a/13020490/960115),包含所需數量的零字符。但是,在「Spinner」對象的特定情況下,我正在努力應用該測量。看起來設置底層'TextField'的'prefWidth'也必須考慮到'padding'屬性(在'initialize'方法中返回0,即使它最終會變成7)以及向上/向下按鈕寬度我似乎無法得到)。 –

回答

1

填充屬性返回0,因爲當時沒有佈置的TextField沒有應用任何CSS樣式。設法得到填充的TextField添加到SceneGraph.

後,當時你還能夠使用Nodeslookup方法來獲取其中含有的箭頭按鈕StackPane

StackPane upArrow = (StackPane) spnr.lookup(".increment-arrow-button"); 
StackPane downArrow = (StackPane) spnr.lookup(".decrement-arrow-button"); 

然後應該是可以計算的寬度微調:

double spinnerWidth = calculateWidth("123", spnr.getEditor()) + upArrow.getWidth(); 

private double calculateWidth(String value, TextField textField) { 
     Text text = new Text(value); 
     text.setFont(textField.getFont()); 
     Insets insets = textField.getInsets(); 
     return insets.getLeft() + text.prefWidth(-1) + insets.getRight(); 
    } 
+0

「TextField」添加到「SceneGraph」後,是否有一些事件可以訂閱?如果不是,那麼實現此功能的標準做法是什麼? –

+0

在問題節點附加到正在顯示的「Stage」中的「Scene」後,可以使用任何提及的方法。所以在用'stage.show()'顯示'Stage'後,你可以調用你需要的方法。 – jns

+0

我所有的JavaFX控制器都已經實現了一個包含'setStage'方法的接口(所以我可以設置所有者彈出對話框)。對於包含'Spinner'控件的組件,我註冊了'Stage.onShown'事件,並在該處理程序中執行寬度計算。 –