2014-05-15 20 views
11

Sto solo provando JavaFX e sto forzando la mia strada perché è il futuro. Sto cercando di creare una tabella con 4 colonne. Le colonne AND THE TABLE devono essere ridimensionate per riempire il riquadro principale. Non posso per la vita di me farlo funzionare. Ho provato per oltre 4 ore e la tableview non viene ridimensionata.Vista tabella Java ridimensiona per adattarsi alla finestra

Ecco il mio file FXML.

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import java.net.*?> 
<?import javafx.geometry.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.control.cell.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.collections.*?> 
<?import t.cubed.fxml.*?> 


<BorderPane styleClass="root" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="t.cubed.fxml.FXMLDocumentController"> 
    <top> 
     <MenuBar fx:id="menuBar" styleClass="menu-bar"> 
     <menus> 
      <Menu text="File"> 
       <items> 
        <MenuItem onAction="#handleOpenAction" text="Open" /> 
        <MenuItem onAction="#handleExitAction" text="Exit" /> 
       </items> 
      </Menu> 
      <Menu text="Edit"> 
       <items> 
        <MenuItem onAction="#handleWeightAction" text="Edit Weights" /> 
        <MenuItem onAction="#handleFilterAction" text="Edit Filters" /> 
        <MenuItem onAction="#handleOptionsAction" text="Options" /> 
       </items> 
      </Menu> 
     </menus> 
    </MenuBar> 
    </top> 
    <center> 
     <GridPane> 
       <!-- 
       <padding> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> 
       </padding> 
       --> 
       <TableView fx:id="testTable" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.columnSpan="1"> 
        <columnResizePolicy> 
         <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 
        </columnResizePolicy> 
        <columns> 
         <TableColumn text="TEST NUMBER"> 
         <cellValueFactory> 
          <PropertyValueFactory property="testNumber" /> 
         </cellValueFactory> 
         </TableColumn> 
         <TableColumn text="TEST NAME"> 
          <cellValueFactory> 
          <PropertyValueFactory property="testName" /> 
         </cellValueFactory> 
         </TableColumn> 
         <TableColumn text="TEST TIME(ms)"> 
          <cellValueFactory> 
          <PropertyValueFactory property="testTime" /> 
         </cellValueFactory> 
         </TableColumn> 
         <TableColumn text="BEST MATCH"> 
          <cellValueFactory> 
          <PropertyValueFactory property="bestMatch" /> 
         </cellValueFactory> 
         </TableColumn> 
        </columns> 
        <items> 
        <!-- 
        <FXCollections fx:factory="observableArrayList"> 
         <TestTableModel testNumber="100" testName="Test1234" testTime="0.34" bestMatch="99"/> 
        </FXCollections> 
        --> 
       </items> 
       </TableView> 
     </GridPane> 
    </center> 
<stylesheets> 
    <URL value="@t-cubed.css" /> 
</stylesheets> 
</BorderPane> 
+0

Utilizzare un AnchorPane invece di GridPane. – brian

risposta

18

Come ridimensionabile layout Opere

le dimensioni degli oggetti ridimensionabili in JavaFX è gestito dai gestori di layout in cui sono collocati gli elementi.

Quello che dovete fare

Per il vostro particolare problema, è necessario impostare il GridPane dimensionamento vincoli per gestire il TableView che è stato inserito nella griglia.

Vedi le GridPane.hgrow e GridPane.vgrow vincoli ho aggiunto sul TableView:

<TableView fx:id="testTable" 
      GridPane.columnIndex="0" 
      GridPane.columnSpan="1" 
      GridPane.hgrow="ALWAYS" 
      GridPane.vgrow="ALWAYS" 
      GridPane.rowIndex="0"> 

FXML riflette solo le API Java, quindi si potrebbe anche fare lo stesso nel sorgente Java pure; Ad esempio GridPane.setHGrow(node, priority). Tuttavia, se si utilizza FXML per il layout, è consigliabile definire i vincoli di layout in FXML.

grid

Esempio refactoring

ho caricato il tuo FXML in Scene Builder 2 e impostare i vincoli del caso e sembra ridimensionare automaticamente bene quando uso la funzionalità di anteprima di scene Builder.

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

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import java.net.*?> 
<?import javafx.geometry.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.control.cell.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.collections.*?> 
<?import t.cubed.fxml.*?> 

<BorderPane styleClass="root" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="t.cubed.fxml.FXMLDocumentController"> 
    <top> 
    <MenuBar fx:id="menuBar" styleClass="menu-bar"> 
     <menus> 
     <Menu text="File"> 
      <items> 
      <MenuItem onAction="#handleOpenAction" text="Open" /> 
      <MenuItem onAction="#handleExitAction" text="Exit" /> 
      </items> 
     </Menu> 
     <Menu text="Edit"> 
      <items> 
      <MenuItem onAction="#handleWeightAction" text="Edit Weights" /> 
      <MenuItem onAction="#handleFilterAction" text="Edit Filters" /> 
      <MenuItem onAction="#handleOptionsAction" text="Options" /> 
      </items> 
     </Menu> 
     </menus> 
    </MenuBar> 
    </top> 
    <center> 
    <GridPane> 
     <children> 
     <!-- 
     <padding> 
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> 
     </padding> 
     --> 
     <TableView fx:id="testTable" GridPane.columnIndex="0" GridPane.columnSpan="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0" GridPane.vgrow="ALWAYS"> 
      <columnResizePolicy> 
      <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 
      </columnResizePolicy> 
      <columns> 
      <TableColumn text="TEST NUMBER"> 
       <cellValueFactory> 
       <PropertyValueFactory property="testNumber" /> 
       </cellValueFactory> 
      </TableColumn> 
      <TableColumn text="TEST NAME"> 
       <cellValueFactory> 
       <PropertyValueFactory property="testName" /> 
       </cellValueFactory> 
      </TableColumn> 
      <TableColumn text="TEST TIME(ms)"> 
       <cellValueFactory> 
       <PropertyValueFactory property="testTime" /> 
       </cellValueFactory> 
      </TableColumn> 
      <TableColumn text="BEST MATCH"> 
       <cellValueFactory> 
       <PropertyValueFactory property="bestMatch" /> 
       </cellValueFactory> 
      </TableColumn> 
      </columns> 
      <items> 
      <!-- 
      <FXCollections fx:factory="observableArrayList"> 
       <TestTableModel testNumber="100" testName="Test1234" testTime="0.34" bestMatch="99"/> 
      </FXCollections> 
      --> 
     </items> 
     </TableView> 
     </children> 
     <columnConstraints> 
      <ColumnConstraints /> 
     </columnConstraints> 
     <rowConstraints> 
      <RowConstraints /> 
     </rowConstraints> 
    </GridPane> 
    </center> 
    <stylesheets> 
    <URL value="@t-cubed.css" /> 
    </stylesheets> 
</BorderPane> 

Alcuni consigli

si sta mettendo il TableView all'interno di una GridPane. L'uso di un GridPane nel tuo caso è un po 'strano dato che GridPane colloca un solo nodo nel GridPane. Posizionare semplicemente TableView direttamente al centro di BorderPane o utilizzare un genitore di layout più semplice come StackPane avrebbe funzionato correttamente. Ma forse questa è solo una versione ridotta di un'interfaccia utente più complessa, quindi forse è per questo che hai usato un GridPane.

Ulteriori letture

Se avete tempo, leggere su layout in JavaFX nel javadoc Node, Pane, Group e GridPane e provare questo piccolo layout bounds demo troppo.

domande aggiuntive per Commenti

citarne StackPane avrebbe funzionato, ma StackPanes non sembrano avere Hgrow e Vgrow?

StackPanes non ha bisogno di vincoli Hgrow o Vgrow. Tali vincoli impostati Priorities, che sono definiti come:

enumerazione utilizzato per determinare il crescere (o ridurre) la priorità dell'area di layout un dato nodo quando la sua regione ha più (o meno) di spazio disponibile e più nodi sono competere per quello spazio.

Con uno StackPane, tutti i bambini sono a strati l'uno sopra l'altro, che non competono per lo spazio, quindi tali impostazioni di priorità di crescita per i nodi figli non sono applicabili.

+0

@jewelsea Non mi ero reso conto che potevi trascinare e rilasciare componenti all'interno dell'area della gerarchia. Questo aiuta molto, vorrei che fosse più facile imparare come usare SceneBuilder. –

+0

Tu (o era @will?) menzionare un StackPane avrebbe funzionato, ma StackPanes non sembrano avere Hgrow e Vgrow? – Caelum

0

Dopo alcuni compiti, abbiamo trovato alcune informazioni di qualificazione sui contenitori FXML. Praticamente per lo stesso motivo sopra indicato da @ user3403469. In Scene Builder, c'è una lunga lista di "contenitori". IMHO, solo questi elementi 9 e Pane qualificano come contenitore di layout, in quanto ereditano da

< Pane> ... genitore per tutti Pane classes. Mentre entrambi, Pane e Control ereditano dalla regione, solo le classi figlio Pane hanno proprietà di layout.

* <AnchorPane> 
* <BorderPane> 
* <FlowPane> 
* <GridPane> 
* <StackPane> 
* <TextFlow> 
* <TilePane> 
* <HBox> 
* <VBox> 

È possibile considerare che Controllo classi figlio più o meno eredita Eventi e azioni. I layout come le cose devono provenire dalla regione incapsulante, e l'unica cosa con gli elementi di layout disponibili per racchiudere un 'controllo' è-un 'riquadro'.

Questi elementi FXML sarebbero i su misura 'gestori di layout' descritto nella risposta di @ jewelsea e altrove.

Immagino che i container "Control" siano ancora contenitori in FXML. Sembra che hanno bisogno di essere 'dentro' un pannello per fare del bene ;-)

Correzioni e commento di benvenuto.

correlato:

Problemi correlati