java使用SceneBuilder用数据填充Javafx表
我读过不少关于用数据填充表格的帖子,但还是不明白。 我用场景生成器创建了一个表,实际上是两个表。 但我找不到如何填充其中至少一个表
每个“库存”对象都有两个ArrayList,一个是“零件”类型,另一个是“产品”类型。“零件”和“产品”是两个独立的类。“inHouse”是“Part”的子类
现在,我不知道如何在controller中使用initialize方法,我已经创建了一个可观察列表,并想用这个列表填充其中一个表。我该怎么做?我需要创建控制器类的对象吗?在哪里使用initialize方法?我应该传递什么价值观?在代码中,我在哪里使用控制器类中的列和表的变量?我看过很多帖子,但我就是不明白
这是控制器:
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"));
}
}
这里是主要的。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>
# 1 楼答案
首先,你需要用
oPart
做点什么。具体来说,您希望将其传递给TableView的setItems方法第二,setCellFactory和setCellValue工厂不是一回事。单元格值工厂确定表列中的数据;单元工厂确定数据的显示方式
第三,正如documentation for PropertyValueFactory所解释的,PropertyValueFactory构造函数的字符串参数是而不是列标题,它是表项类中bean属性的名称
(可写)bean属性由两个方法组成:get方法和set方法。要确定属性名,请删除“get”并将剩余部分的第一个字母斩首。(可能比这更复杂,但这与这里没有直接关系。)
因此,如果
Part
类有以下方法:…那么相应的属性名是
name
,这是需要传递给PropertyValueFactory的字符串:但是,如果您已经设计了
Part
类,使其具有与JavaFX兼容的属性,那么您可以完全避免反射,并因此被编译器告知错误:允许您在控制器中执行以下操作:
最后:从
start
方法中删除try/catch。不需要