2012-07-14 13 views
19

Próbuję utworzyć tabelę z dwiema kolumnami. Używam programu budującego sceny zawartego w netbeans 7.2. we wszystkich przykładach, które widziałem, wystarczy, że przeciągniesz kolumnę tabeli do stołu i zajmie ona cały rozmiar, nie jest to prawdą w moim przypadku. to jest plik fxml wygenerowany przez program do tworzenia scen. tylko, aby było jasne, nie zmieniam właściwości tabeli z języka Java.Kolumna tabeli nie przyjmuje pełnego rozmiaru widoku tabeli w javaFX

fxml:

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

<?import java.lang.*?> 
<?import java.net.*?> 
<?import java.util.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 

<AnchorPane id="AnchorPane" prefHeight="758.0" prefWidth="956.0" styleClass="screen" xmlns:fx="http://javafx.com/fxml" fx:controller="bgu.dcr.az.cpu.ui.expb.ExperimentBuilderScreen"> 
    <children> 
    <GridPane id="gridPane1" prefHeight="517.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <children> 
     <Label id="label1" alignment="CENTER" contentDisplay="CENTER" prefHeight="38.0" prefWidth="9999.0" styleClass="caption" text="Create New Experiment" textFill="#990000" GridPane.columnIndex="0" GridPane.rowIndex="0"> 
      <font> 
      <Font name="Consolas Bold" size="20.0" /> 
      </font> 
     </Label> 
     <HBox id="hBox1" alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="5.0" GridPane.columnIndex="0" GridPane.rowIndex="1"> 
      <children> 
      <Label id="label2" graphicTextGap="0.0" styleClass="field-label" text="Experiment Name"> 
       <font> 
       <Font name="Consolas" size="15.0" /> 
       </font> 
       <HBox.margin> 
       <Insets top="3.0" /> 
       </HBox.margin> 
      </Label> 
      <TextField id="textField1" prefWidth="200.0" HBox.hgrow="ALWAYS" /> 
      <Button id="button2" fx:id="saveButton" styleClass="dialog-button" text="Save" /> 
      <Button id="button3" styleClass="dialog-button" text="Dismiss" /> 
      </children> 
      <padding> 
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" /> 
      </padding> 
     </HBox> 
     <VBox id="VBox" alignment="CENTER" spacing="5.0" GridPane.columnIndex="0" GridPane.rowIndex="2"> 
      <children> 
      <Label id="label3" prefWidth="9999.0" styleClass="field-label" text="Experiment Tests"> 
       <VBox.margin> 
       <Insets left="5.0" top="5.0" /> 
       </VBox.margin> 
      </Label> 
      <HBox id="HBox" alignment="CENTER" spacing="5.0"> 
       <children> 
       <Button id="button1" prefHeight="999.0" styleClass="add-button" text="New"> 
        <HBox.margin> 
        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" /> 
        </HBox.margin> 
       </Button> 
       <ListView id="listView1" fx:id="tests" orientation="HORIZONTAL" prefHeight="999.0" prefWidth="200.0" HBox.hgrow="ALWAYS"> 
        <HBox.margin> 
        <Insets bottom="4.0" right="5.0" top="4.0" /> 
        </HBox.margin> 
       </ListView> 
       </children> 
      </HBox> 
      </children> 
     </VBox> 
     <VBox id="vBox1" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="0" GridPane.rowIndex="3"> 
      <children> 
      <GridPane id="gridPane2" VBox.vgrow="ALWAYS"> 
       <children> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="0" GridPane.rowIndex="0" GridPane.rowSpan="4"> 
        <children> 
        <Label id="label4" text="Algorithms"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_algo.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" fx:id="newAlgorithmButton" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" /> 
        </children> 
        <GridPane.margin> 
        <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" fx:id="x2" /> 
        </GridPane.margin> 
       </VBox> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="1" GridPane.margin="$x2" GridPane.rowIndex="1"> 
        <children> 
        <Label id="label4" text="Problem Generator"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_pgen.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" maxHeight="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" /> 
        </children> 
       </VBox> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="2" GridPane.margin="$x2" GridPane.rowIndex="1"> 
        <children> 
        <Label id="label4" prefWidth="9999.0" text="Correctness tester"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_ctest.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" /> 
        </children> 
       </VBox> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="1" GridPane.margin="$x2" GridPane.rowIndex="2"> 
        <children> 
        <Label id="label4" prefWidth="130.0" text="Message delayer"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_mdel.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" /> 
        </children> 
       </VBox> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="2" GridPane.margin="$x2" GridPane.rowIndex="2"> 
        <children> 
        <Label id="label4" prefWidth="130.0" text="Limiter"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_limiter.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" maxHeight="999.0" maxWidth="999.0" prefHeight="999.0" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" VBox.vgrow="ALWAYS" /> 
        </children> 
       </VBox> 
       <VBox id="vBox2" prefHeight="321.0" prefWidth="150.0" styleClass="with-dashed-border" GridPane.columnIndex="3" GridPane.margin="$x2" GridPane.rowIndex="0" GridPane.rowSpan="4"> 
        <children> 
        <Label id="label4" prefWidth="9999.0" text="Statistic collectors"> 
         <graphic> 
         <ImageView id="emptyImageView1" fitHeight="32.0" fitWidth="32.0" preserveRatio="true"> 
          <image> 
          <Image url="@_scol.png" preserveRatio="false" smooth="false" /> 
          </image> 
         </ImageView> 
         </graphic> 
        </Label> 
        <Button id="button1" prefWidth="999.0" styleClass="add-button" text="New" VBox.margin="$x3" /> 
        </children> 
       </VBox> 
       <HBox id="hBox1" alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="5.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="0"> 
        <children> 
        <Label id="label2" graphicTextGap="0.0" styleClass="field-label" text="Name"> 
         <HBox.margin> 
         <Insets top="7.0" /> 
         </HBox.margin> 
        </Label> 
        <TextField id="textField1" maxHeight="28.0" minHeight="28.0" prefHeight="28.0" prefWidth="200.0" text="Empty Test" HBox.hgrow="ALWAYS" /> 
        </children> 
        <padding> 
        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" fx:id="x3" /> 
        </padding> 
       </HBox> 
       <VBox id="vBox3" prefHeight="200.0" prefWidth="100.0" GridPane.columnIndex="1" GridPane.rowIndex="3" /> 
       </children> 
       <columnConstraints> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
       </columnConstraints> 
       <rowConstraints> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> 
       </rowConstraints> 
      </GridPane> 
      </children> 
     </VBox> 
     <VBox id="vBox4" alignment="CENTER" styleClass="with-dashed-border" GridPane.columnIndex="0" GridPane.halignment="CENTER" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4" GridPane.valignment="CENTER" GridPane.vgrow="ALWAYS"> 
      <children> 
      <TableView id="tableView1" prefHeight="54.0" prefWidth="837.0" VBox.vgrow="ALWAYS"> 
       <columns> 
       <TableColumn prefWidth="75.0" text="Column X" /> 
       <TableColumn prefWidth="75.0" text="Column X" /> 
       </columns> 
      </TableView> 
      </children> 
      <GridPane.margin> 
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" fx:id="x2" /> 
      </GridPane.margin> 
     </VBox> 
     </children> 
     <columnConstraints> 
     <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> 
     </columnConstraints> 
     <rowConstraints> 
     <RowConstraints maxHeight="38.0" minHeight="38.0" prefHeight="38.0" vgrow="NEVER" /> 
     <RowConstraints maxHeight="32.0" minHeight="32.0" prefHeight="32.0" vgrow="NEVER" /> 
     <RowConstraints maxHeight="100.0" minHeight="100.0" prefHeight="100.0" vgrow="SOMETIMES" /> 
     <RowConstraints vgrow="SOMETIMES" /> 
     <RowConstraints maxHeight="100.0" prefHeight="100.0" valignment="CENTER" vgrow="ALWAYS" /> 
     </rowConstraints> 
    </GridPane> 
    </children> 
    <stylesheets> 
    <URL value="@_style.css" /> 
    <URL value="@../_style.css" /> 
    </stylesheets> 
</AnchorPane> 

Odpowiedz

41

Aktualizacja

Nowe funkcje w JavaFX 2.2+ wydaniach uczyniły tę odpowiedź za przestarzałe, gdy stosowane z dokumentem FXML.

Rozwiązanie oparte na FXML, które wykorzystuje nowe funkcje FXML, aby umożliwić ustawienie rozmiaru kolumny za pomocą FXML, dostępne jest pod adresem: FXML set TableView column resize policy.

<TableView fx:id="tableView" layoutX="110.0" layoutY="78.0" prefHeight="200.0" prefWidth="396.0"> 
    <columnResizePolicy><TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/></columnResizePolicy> 
    <columns> 
     <TableColumn prefWidth="75.0" text="Column X" /> 
     <TableColumn prefWidth="75.0" text="Column X" /> 
    </columns> 
</TableView> 

Jeśli nie używasz FXML polityka Resize tableview można jeszcze ustawić za pomocą kodu zdefiniowanego w tej odpowiedzi:

tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

W swojej FXML, zdefiniowaniu preferowaną szerokość tabela do 837, a preferowana szerokość każdej z kolumn do 75. Domyślnie zasady zmiany rozmiaru kolumny JavaFX zachowują kolumny w preferowanych szerokościach. Nie spowodujesz, że kolumny tabeli wypełnią szerokość całej twojej tabeli, chyba że ustawisz nową kolumnę zmieniającą zasady lub ustawisz sumę preferowanych szerokości wszystkich kolumn, tak aby sumowały się z szerokością tabeli.

JavaFX udostępnia mechanizm do modify the default column resizing policy. Ustawiając zasadę zmiany rozmiaru kolumny na CONSTRAINED_RESIZE_POLICY, suma szerokości każdej kolumny będzie ograniczona w celu wypełnienia szerokości widoku tabeli - nawet jeśli rozmiar tabeli zostanie zmieniony lub zmienią się poszczególne kolumny. Jest to prawdopodobne zachowanie, którego pragniesz.

Chociaż może istnieć sposób ustawienia CONSTRAINED_RESIZE_POLICY na tableView z FXML, nie jestem tego świadomy (choć moje umiejętności w fxml są prymitywne - więc być może ktoś bardziej poinformowany może wykonać konfigurację używając czystego fxml).

Możliwe jest zdefiniowanie kontrolera dla pliku fxml, a następnie skonfigurowanie zasady zmiany rozmiaru w kontrolerze. Poniższy kod ilustruje pełny przykład (napisany pod kątem podglądu JavaFX 2.2b17).

plik FXML: Klasa

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

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

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="tableview.TableViewController"> 
    <children> 
    <TableView fx:id="tableView" layoutX="110.0" layoutY="78.0" prefHeight="200.0" prefWidth="396.0"> 
     <columns> 
     <TableColumn prefWidth="75.0" text="Column X" /> 
     <TableColumn prefWidth="75.0" text="Column X" /> 
     </columns> 
    </TableView> 
    </children> 
</AnchorPane> 

Kontroler: klasa

package tableview; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableView; 

/* controller class for the tableview fxml definition */ 
public class TableViewController implements Initializable { 
    @FXML // fx:id="tableView" 
    private TableView<?> tableView; // Value injected by FXMLLoader 

    @Override // This method is called by the FXMLLoader when initialization is complete 
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) { 
    assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file 'tableview.fxml'."; 

    // initialize your logic here: all @FXML variables will have been injected 
    tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
    } 
} 

Zastosowanie:

package tableview; 

import java.io.IOException; 
import java.net.URL; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Stage; 

/** Main application class for tableview fxml demo application */ 
public class TableViewApplication extends Application { 
    public static void main(String[] args) { launch(args); } 
    @Override public void start(Stage stage) throws IOException { 
    AnchorPane layout = FXMLLoader.load(
     new URL(TableViewApplication.class.getResource("tableview.fxml").toExternalForm()) 
    ); 
    stage.setScene(new Scene(layout)); 
    stage.show(); 
    } 
} 
+0

Bardzo dziękuję @jewelsea, że ​​byłeś pierwszym i jedynym miejscem, w którym znalazłem sposób kontrolowania zmiany rozmiaru kolumn. jeśli natknę się na sposób sterowania tabelą z fxml, opublikuję go tutaj. – raven

+0

Wydaje mi się dziwne, aby dodać konfigurację interfejsu użytkownika do kontrolera. Możesz zrobić to samo, dodając znacznik XML do pliku .fxml, jak pokazano w tym łączu: http://stackoverflow.com/questions/14095708/fxml-set-tableview-column-resize-policy – gabuzo

+0

Dzięki za link gabuzo , Zaktualizowałem odpowiedź, aby odzwierciedlić nową funkcjonalność JavaFX 2.2, która teraz pozwala zdefiniować zasady zmiany rozmiaru kolumny tabeli z FXML. – jewelsea

2

W przypadku korzystania z JavaFX GUI Builder "SceneBuilder 2.0" - użyj Tableview nieruchomości ColumnResizePolicy wartość "ograniczony-resize".

Powiązane problemy