【问题标题】:Populating Javafx Table with data, using SceneBuilder使用 SceneBuilder 使用数据填充 Javafx 表
【发布时间】:2018-10-09 12:52:03
【问题描述】:

我已经阅读了很多关于用数据填充表格的帖子,但仍然无法理解。 我用场景生成器创建了一个表,实际上是 2 个表。 但是我找不到如何填充这些表中的至少一个。

每个“Inventory”对象都有 2 个数组列表,一个是“Part”类型,一个是“Product”类型。 “Part”和“Product”是不同的类。 “inHouse”是“Part”的子类。

现在,我不知道如何在控制器中使用初始化方法,我已经创建了 1 个可观察列表,并希望使用该列表填充其中一个表。我怎么做?我需要创建控制器类的对象吗?我在哪里使用初始化方法?我传递了什么价值观?我在代码中的哪里使用控制器类中的列和表的变量?我看了很多帖子,就是不明白。

这里是控制器:

package application;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.cell.PropertyValueFactory;

public class PartTable implements Initializable{

@FXML
private TreeTableView<Part> partTable;

@FXML
private TreeTableColumn<Part, Integer> partID;

@FXML
private TreeTableColumn<Part, String> partName;

@FXML
private TreeTableColumn<Part, Integer> inventoryLevel;

@FXML
private TreeTableColumn<Part, Double> partPrice;

@FXML
private TreeTableView<Product> productTable;

@FXML
private TreeTableColumn<Product, Integer> productID;

@FXML
private TreeTableColumn<Product, String> productName;

@FXML
private TreeTableColumn<Product, Integer> inventoryLevel2;

@FXML
private TreeTableColumn<Product, Double> productPrice;

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub
    partID.setCellValueFactory(new PropertyValueFactory("PartID"));
    partName.setCellFactory(new PropertyValueFactory("Part Name"));
    inventoryLevel.setCellFactory(new PropertyValueFactory("Inventory Level"));
    partPrice.setCellFactory(new PropertyValueFactory("Price/Cost per Unit"));

}

}

这是 Main.java(我知道,很多导入都是多余的,但无论如何):

package application;



import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;


public class Main extends Application {



private TableView table1 = new TableView();



@Override
public void start(Stage primaryStage) throws Exception{
    try {


        Inventory i1 = new Inventory(); 
        i1.addPart(new InHouse(54534, "boli", 156.0, 2, 0, 100));
        i1.addPart(new InHouse(74541, "libo", 156.0, 2, 0, 100));
        i1.addPart(new InHouse(24551, "luci", 156.0, 2, 0, 100));
        i1.addPart(new InHouse(44581, "buci", 156.0, 2, 0, 100));
        i1.addPart(new InHouse(94531, "boluci", 156.0, 2, 0, 100));

        ObservableList<Part> oPart = FXCollections.observableList(i1.getPartList());

        PartTable table = new PartTable();




        Pane mainPane = (Pane)FXMLLoader.load(Main.class.getResource("MainMenu.fxml"));



        Scene scene = new Scene(mainPane);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setTitle("Inventory Management System");
        primaryStage.setScene(scene);
        primaryStage.show();





    } catch(Exception e) {
        e.printStackTrace();
    }



}

public static void main(String[] args) {
    launch(args);
}

}

这是 fxml 文件:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.TreeTableColumn?>
<?import javafx.scene.control.TreeTableView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="482.0" prefWidth="1220.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.PartTable">
   <children>
      <HBox layoutX="7.0" layoutY="12.0" prefHeight="440.0" prefWidth="1200.0" spacing="30.0">
         <children>
            <GridPane prefHeight="440.0" prefWidth="600.0">
              <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 maxHeight="174.0" minHeight="10.0" prefHeight="109.0" vgrow="SOMETIMES" />
                <RowConstraints maxHeight="249.0" minHeight="9.0" prefHeight="218.0" vgrow="SOMETIMES" />
                <RowConstraints maxHeight="284.0" minHeight="10.0" prefHeight="108.0" vgrow="SOMETIMES" />
              </rowConstraints>
               <children>
                  <GridPane GridPane.columnSpan="4">
                    <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 hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Button mnemonicParsing="false" text="Search" GridPane.columnIndex="2">
                           <font>
                              <Font size="15.0" />
                           </font>
                        </Button>
                        <TextField GridPane.columnIndex="3" GridPane.columnSpan="2" />
                        <Label prefHeight="63.0" prefWidth="88.0" text="Parts">
                           <font>
                              <Font size="17.0" />
                           </font>
                        </Label>
                     </children>
                  </GridPane>
                  <TreeTableView fx:id="partTable" prefHeight="220.0" prefWidth="100.0" GridPane.columnSpan="4" GridPane.rowIndex="1">
                    <columns>
                      <TreeTableColumn fx:id="partID" editable="false" prefWidth="75.0" text="PartID" />
                      <TreeTableColumn fx:id="partName" editable="false" prefWidth="75.0" text="Part Name" />
                        <TreeTableColumn fx:id="inventoryLevel" editable="false" prefWidth="75.0" text="Inventory Level" />
                        <TreeTableColumn fx:id="partPrice" editable="false" prefWidth="75.0" text="Price/Cost per Unit" />
                    </columns>
                     <columnResizePolicy>
                        <TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TreeTableView>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="142.0" text="Delete" GridPane.columnIndex="3" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="202.0" text="Modify" GridPane.columnIndex="2" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="162.0" text="Add" GridPane.columnIndex="1" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
               </children>
            </GridPane>
            <GridPane layoutX="10.0" layoutY="10.0" prefHeight="440.0" prefWidth="600.0">
               <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 maxHeight="174.0" minHeight="10.0" prefHeight="109.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="249.0" minHeight="9.0" prefHeight="218.0" vgrow="SOMETIMES" />
                  <RowConstraints maxHeight="284.0" minHeight="10.0" prefHeight="108.0" vgrow="SOMETIMES" />
               </rowConstraints>
               <children>
                  <GridPane GridPane.columnSpan="4">
                     <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 hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                     </columnConstraints>
                     <rowConstraints>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                     </rowConstraints>
                     <children>
                        <Button mnemonicParsing="false" text="Search" GridPane.columnIndex="2">
                           <font>
                              <Font size="15.0" />
                           </font>
                        </Button>
                        <TextField GridPane.columnIndex="3" GridPane.columnSpan="2" />
                        <Label prefHeight="63.0" prefWidth="88.0" text="Products">
                           <font>
                              <Font size="17.0" />
                           </font>
                        </Label>
                     </children>
                  </GridPane>
                  <TreeTableView fx:id="productTable" prefHeight="220.0" prefWidth="100.0" GridPane.columnSpan="4" GridPane.rowIndex="1">
                     <columns>
                        <TreeTableColumn fx:id="productID" editable="false" prefWidth="75.0" text="ProductID" />
                        <TreeTableColumn fx:id="productName" editable="false" prefWidth="75.0" text="Product Name" />
                        <TreeTableColumn fx:id="inventoryLevel2" editable="false" prefWidth="75.0" text="Inventory Level" />
                        <TreeTableColumn fx:id="productPrice" editable="false" prefWidth="75.0" text="Price per Unit" />
                     </columns>
                     <columnResizePolicy>
                        <TreeTableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TreeTableView>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="142.0" text="Delete" GridPane.columnIndex="3" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="172.0" text="Modify" GridPane.columnIndex="2" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
                  <Button mnemonicParsing="false" prefHeight="39.0" prefWidth="219.0" text="Add" GridPane.columnIndex="1" GridPane.rowIndex="2">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Button>
               </children>
            </GridPane>
         </children>
      </HBox>
   </children>
</Pane>

【问题讨论】:

  • 阅读您非常基本的问题(并查看您的代码),我建议您先阅读一个非常基本的教程;)请参阅 javafx 标记的信息选项卡以获取参考

标签: java javafx tableview


【解决方案1】:

首先,您需要对oPart 进行实际操作。具体来说,您希望将其传递给 TableView 的 setItems 方法。

其次,setCellFactory 和 setCellValueFactory 不是一回事。单元格 value 工厂确定您表格列中的 data;单元工厂确定数据的显示方式。

第三,正如documentation for PropertyValueFactory 解释的那样,PropertyValueFactory 构造函数的String 参数不是列标题,它是表项类中的bean 属性的名称。

一个(可写的)bean 属性由两个方法组成:一个get 方法和一个set 方法。要确定属性名称,请删除“get”并将其余部分的第一个字母大写。 (它可能比这更复杂一些,但这与这里没有直接关系。)

所以,如果你的 Part 类有这些方法:

public String getName() {
    // ...
}

public void setName(String name) {
    // ...
}

…那么对应的属性名是name,也就是你需要传递给PropertyValueFactory的String:

partName.setCellValueFactory(new PropertyValueFactory("name"));

但是,如果您设计了 Part 类使其具有符合 JavaFX 的属性,则可以完全避免反射,从而被编译器告知错误:

private final StringProperty name = new SimpleStringProperty();

// ...

public StringProperty nameProperty() {
    return name;
}

public String getName() {
    return name.get();
}

public void setName(String name) {
    this.name.set(name);
}

这允许您在控制器中执行此操作:

partName.setCellValueFactory(f -> f.getValue().nameProperty());

最后:从 start 方法中删除 try/catch。不需要。

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 2018-08-12
    • 2013-09-01
    • 2018-05-12
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2013-06-01
    • 2015-03-04
    相关资源
    最近更新 更多