2016-05-12 28 views
1

javafx.scene.layout.HBoxを含むJavaFXシーンがあります。このHBoxには、2人の子供、javafx.scene.control.ComboBoxとそれに続くjavafx.scene.control.Spinnerが含まれています。私の問題を説明するための最小限のFXMLファイルは次のとおりです。コードでJavaFX HBox HGrow優先度

<?import javafx.scene.control.ComboBox?> 
<?import javafx.scene.control.Spinner?> 
<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory?> 
<?import javafx.scene.layout.HBox?> 

<HBox xmlns="http://javafx.com/javafx/8.0.65" 
     xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
    <ComboBox fx:id="myComboBox" /> 
    <Spinner fx:id="mySpinner" editable="true"> 
     <valueFactory> 
     <SpinnerValueFactory.IntegerSpinnerValueFactory 
       min="0" max="999" initialValue="0" /> 
     </valueFactory> 
    </Spinner> 
    </children> 
</HBox> 

ComboBoxは(文字数)非常に長い文字列が移入されています。私はSpinnerの希望の幅も指定しています。望ましい効果がSpinner制御は、それが幅を好んだ割り当てられ、ComboBox制御はスペースの残りを与えられることである

@FXML 
private ComboBox<String> myComboBox; 

@FXML 
private Spinner<Integer> mySpinner; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    myComboBox.getItems().setAll(
     "Some very long string that takes up a very large portion" + 
     " of the screen. You can probably see where this is going."); 
    mySpinner.getEditor().setPrefColumnCount(3); 
} 

:次のコードは、私がやっているものの代表です。しかし、私が見ているのは、ComboBoxコントロールに少なくとも1つの非常に長いオプションが含まれているため、ほとんどのスペースが(割り当てられたスペースよりもはるかに広いため)割り当てられているということです。私がスピナーコントロールで見ることができるのは上下の矢印だけです。

ComboBoxの推奨幅を検討する前に、JavaFXでSpinnerオブジェクトの領域を割り当てる方法を知っている人はいますか?

+0

minWidthは役に立ちませんか? –

+0

'minWidth'のために何を入れるべきかはわかりません。使用されているフォントに依存するからです。私は、RedHat LinuxがWindows 7よりもはるかに大きな既定のフォントを使用していることを観察しました。フォントを事前に知っていないと(Windowsのフォントサイズなどのユーザー設定可能な設定)、 'minWidth'有用。 –

+0

'Spinner'のフォントは' spinner.getEditor()。getFont() ' – jns

答えて

4

解決策はありますが、SpinnerオブジェクトのminWidthを好ましい幅に設定する方が簡単です。以下に、あなたのオリジナルのFXMLを変更します。

... 
<Spinner fx:id="mySpinner" editable="true" minWidth="-Infinity"> 
<ComboBox fx:id="myComboBox" HBox.hgrow="ALWAYS" maxWidth="Infinity" /> 
... 

このコードに次のようにやってと同等です:

mySpinner.setMinWidth(Region.USE_PREF_SIZE); 

残し、他のすべてと同じ、これらの変更のいずれかが必要な結果を生成します。

+0

私はこのソリューションが私よりも2つ理由で好きです:あなたはFXMLの中で 'hgrow'プロパティを設定でき、' myComboBox .prefWidth'。 –

0

私はこれを解決する方法を考え出しました。 FXMLでは、私はComboBox要素にprefWidthmaxWidthの両方を指定する必要があります。

... 
<ComboBox fx:id="myComboBox" prefWidth="200" maxWidth="Infinity" /> 
... 

次に、initializeメソッドで、私は次の行を追加する必要がありました:

HBox.setHgrow(myComboBox, Priority.ALWAYS); 

これは私の問題を解決しました。今、私は別の問題を見ています。これは、Spinnerコントロールのサイズが3文字に近くないということです。しかし、それは話題にはならないので、私はその懸案事項について別の質問を開くつもりです。

+0

で得ることができます。あなたは' Spinner'にminSizeを設定しなければなりません。 'ComboBox'にhGrowを設定する必要はありません。 – jns

+0

あなたは 'minSize'の使用に関するあなたの推奨についてより具体的になりますか? 'Spinner' FXMLに' minWidth = "1" minHeight = "1" 'を追加し、' ComboBox'から 'prefWidth'と' maxWidth'プロパティを取り除くと、私はまだほぼ0幅の 'Spinner' (Win 7 Enterprise SP1 x64上のJRE 8u77)。あなたは何か違う何かを見ていますか、私はあなたの推薦を誤解していますか? –

+0

あなたはそうです。 comboBoxのhGrowを設定する必要があります。minWidthについては、私は答えを追加しました – jns