2015-04-07 14 views
8


Ho un problema con JavaFX (8), HBox, ComboBox e HGrow. HGrow non funziona in combinazione con ComboBox.

(INFO: con TextField (invece di ComboBox), funziona come previsto)JavaFX - Come rendere ComboBox hgrow?

Questo è il mio FXML-Code:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<VBox prefHeight="117.0" prefWidth="285.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.test.TestController"> 
    <children> 
    <HBox prefHeight="105.0" prefWidth="196.0" VBox.vgrow="ALWAYS"> 
    <children> 
     <ComboBox fx:id="fxCboTest" prefHeight="25.0" prefWidth="62.0" HBox.hgrow="ALWAYS" /> 
    </children> 
    </HBox> 
    </children> 
</VBox> 

presente Codice si tradurrà in:

enter image description here

ho anche provato il seguente codice (senza esito positivo, questo codice non fa nulla):

HBox.setHgrow(uiController.fxCboTest, Priority.ALWAYS); 

Qualcuno ha un'idea di come realizzare un ComboBox HGrow?

risposta

17

Questa è una risposta alla mia domanda.
Dopo qualche test, ho scoperto che quando si imposta Larghezza massima a MAX_VALUE, funziona:

enter image description here

questo si tradurrà in codice seguente/xml da SceneBuilder:

... 
<children> 
    <ComboBox maxWidth="1.7976931348623157E308" prefWidth="150.0" HBox.hgrow="ALWAYS" /> 
</children> 
... 

dove 1.7976931348623157E308 si presenta come Double.MAX_VALUE.

Ciò funzionerà anche con più controlli in Hbox.
enter image description here

A mio parere, questo non è molto conseguentemente/coerente.
Non riesco ancora a capire perché HGrow non funzioni per ComboBox.

+0

'hgrow' non sovrascrive la larghezza massima di un nodo ridimensionabile, che per impostazione predefinita è impostata sulla dimensione preferita. Ci sono alcune informazioni su questo [tutorial] (http://docs.oracle.com/javase/8/javafx/layout-tutorial/size_align.htm#JFXLY133) e anche un'eccellente [presentazione a Parleys] (https: //www.parleys.com/tutorial/interface-layout-javafx-2-0) (è richiesta la registrazione). –

+1

Quindi, perché funziona quando si sostituisce semplicemente ComboBox con TextField in XML? – Ben

+4

Scavate un po 'di più nelle impostazioni predefinite. I valori predefiniti di 'maxWidth' per entrambi al valore sentinella' Region.COMPUTED_SIZE', che provoca una chiamata a 'computeMaxWidth (...)'. Per i controlli, a sua volta delegati all'implementazione della skin.Scavando nel codice sorgente, 'ComboBoxBaseSkin' risolve questo restituendo la larghezza preferita; il 'TextFieldSkin' eredita l'implementazione predefinita' SkinBase', che restituisce 'Double.MAX_VALUE'. Quindi una casella combinata per impostazione predefinita è limitata alla sua dimensione preferita; un campo di testo può crescere indefinitamente. La linea di fondo è che hanno diversi valori di default. –

1

Questo è un trucco, ma dovrebbe funzionare. All'interno del metodo intialize del controller, definire un binding.

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    fxCboTest.prefWidthProperty().bind(hbox.widthProperty()); 
} 
+0

Grazie per il tuo suggerimento, ma questo codice potrebbe non funzionare correttamente quando (non nel mio esempio di codice, perché voglio mantenere il mio esempio il più semplice possibile) la hbox contiene più controlli, come ComboBox e Button. Voglio evitare di fare troppi calcoli da solo. – Ben

+0

La domanda non ha mai menzionato che volevi più bambini nella HBox. – ItachiUchiha

+0

Hai ragione, questo è il motivo per cui aggiungo un commento alla tua risposta perché la tua soluzione ** potrebbe ** non funzionare con più controlli. non ho detto che la tua soluzione è assolutamente inutile. – Ben