2016-05-12 12 views
0

setPrefColumnCountを呼び出した後に、javafx.scene.control.TextFieldの適切な幅が正しく計算されないという奇妙な動作が見られます。私の具体的な使用例は、javafx.scene.control.Spinnerコントロールです。JavaFX TextField.setPrefColumnCount()が動作しません。

Incorrectly Sized Spinner

@FXML 
private Spinner<Integer> mySpinner; 

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

上記を実行した後、私は(スピナー値は999で描かれて)単一の文字のための十分なかろうじて大きいスピナーを取得し、次のように私のコードです誰もが表示できるようにする数字の数に基づいてTextFieldの幅を設定する正しい方法を知っていますか?私はWindows 7 Enterprise SP1 x64上でJRE 8u77を使用しています。

EDIT

私は問題の一部は、私が指示here経由でテキストを測定する場合でも、私はまだにSpinner.prefWidthを設定するかわからないということであることを実現しています。さらに、TextFieldエディタのprefWidthSpinnerオブジェクトに設定しても変わりません。 TextField.paddingプロパティを取得する方法はありますか(最終的に両側に7に設定されますが、initializeメソッド内で0を返します)。上下の矢印の幅を照会する方法はありますか?何らかの形でこれらの値を計算/照会できたら、測定テキストテクニックを使用できます。その情報がなければ、私はそれについてどうやって行くのか分かりません。

+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

TextFieldには、その時点でレイアウトされていないため、適用されるCSSスタイルがないため、埋め込みプロパティは0を返します。そして、それを

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

TextFieldあなたはまた、矢印ボタンが含まれているStackPaneを取得するためにNodeslookupメソッドを使用することができるしているその時にSceneGraph.

に追加された後にパディングを取得してくださいスピナーの幅を計算することが可能でなければなりません:

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'イベントに登録し、そのハンドラ内でこの幅の計算を実行します。 –

関連する問題