有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    首先,你需要用oPart做点什么。具体来说,您希望将其传递给TableView的setItems方法

    第二,setCellFactory和setCellValue工厂不是一回事。单元格工厂确定表列中的数据;单元工厂确定数据的显示方式

    第三,正如documentation for PropertyValueFactory所解释的,PropertyValueFactory构造函数的字符串参数是而不是列标题,它是表项类中bean属性的名称

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

    因此,如果Part类有以下方法:

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

    …那么相应的属性名是name,这是需要传递给PropertyValueFactory的字符串:

    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。不需要