当前位置: 首页 > 知识库问答 >
问题:

JavaFX,为什么TableColumn为空?

仉成益
2023-03-14

正如您将看到的,当涉及到Java和JavaFX时,我是一个大傻瓜。我花了很多时间四处阅读(各种论坛帖子和tuts)并试图弄清楚我自己是从哪里得到这个问题的,但它已经到了我发帖从一个了解他们的业务的人那里得到反馈的地步。

在回复的时候,请你花点时间解释一下为什么有些东西不能工作,以及一些一般性的指示?这里是我到目前为止所拥有的(我的FXML和我的两个类)任何指针都将是美妙的!!

我的FXML;

<Pane id="myScene" fx:id="myScene" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
      prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="sample.TestController">
   <children>
      <TableView id="employeesTable" fx:id="employeesTable" layoutX="131.0" layoutY="64.0" prefHeight="200.0" prefWidth="360.0">
        <columns>
          <TableColumn id="colFirstName" fx:id="colFirstName" prefWidth="75.0" text="First Name" />
          <TableColumn id="colLastName" fx:id="colLastName" prefWidth="75.0" text="Last Name" />
            <TableColumn id="colEmail" fx:id="colEmail" prefWidth="75.0" text="email" />
        </columns>
      </TableView>
   </children>
</Pane>

现在我拥有的员工类;

public class Employee {

private StringProperty firstName;
private StringProperty lastName;
private StringProperty email;


public Employee(String a, String b, String c) {
    this.firstName = new SimpleStringProperty(a);
    this.lastName = new SimpleStringProperty(b);
    this.email = new SimpleStringProperty(c);
}

public Employee() {
}


public String getFirstName() {
    return firstName.get();
}

public StringProperty firstNameProperty() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName.set(firstName);
}

public String getLastName() {
    return lastName.get();
}

public StringProperty lastNameProperty() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName.set(lastName);
}

public String getEmail() {
    return email.get();
}

public StringProperty emailProperty() {
    return email;
}

public void setEmail(String email) {
    this.email.set(email);
}

}

最后,我的测试控制器的类是

public class TestController {
public Label login;
public TextField loginUserName;
public PasswordField loginPassword;
public TextField testOutput;
@FXML TableView<Employee> employeesTable;
@FXML TableColumn<Employee, String> colFirstName;
@FXML TableColumn<Employee, String> colLastName;
@FXML TableColumn<Employee, String> colEmail;
@FXML Pane myScene;

//public javafx.scene.control.TableView employeesTable;
private ObservableList<Employee> myData;
private MainController MainController;

public void loadEmployeeForm(ActionEvent actionEvent) throws IOException, SQLException, ClassNotFoundException {
    myData = FXCollections.observableArrayList(DBCON.getEmployees());
    System.out.println(myData.size());
    Parent root = FXMLLoader.load(getClass().getResource("frmEmployees.fxml"));
    Scene myScene = new Scene( root );
    sample.MainController.setScene(myScene);
    colFirstName.setCellValueFactory(new PropertyValueFactory<Employee, String>("firstName"));
    colLastName.setCellValueFactory(new PropertyValueFactory<Employee, String>("lastName"));
    colEmail.setCellValueFactory(new PropertyValueFactory<Employee, String>("email"));
    employeesTable.setItems(null);
    employeesTable.setItems(myData);
    employeesTable.setVisible(true);
}

谢谢马克

更新1;

load employee表单的方法是从MyMain.fxml上的按钮调用的;

    <GridPane alignment="CENTER" hgap="10" prefHeight="300" prefWidth="300" vgap="10" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8"
          fx:controller="sample.TestController" stylesheets="/sample/myFirst.css">
    <children>
       <Button onAction="#login" text="Login" GridPane.halignment="CENTER" GridPane.rowIndex="5" GridPane.valignment="CENTER" />
        <Button text="GoEmployees" onAction="#loadEmployeeForm" GridPane.halignment="CENTER" GridPane.rowIndex="3" GridPane.valignment="CENTER" />
       <Label fx:id="login" GridPane.rowIndex="1" />
      <Label text="UserName" GridPane.columnIndex="0" GridPane.rowIndex="1" />
      <Label text="Password" GridPane.columnIndex="0" GridPane.rowIndex="2" />
      <TextField fx:id="loginUserName" GridPane.rowIndex="1" GridPane.columnIndex="1" />
      <PasswordField fx:id="loginPassword" GridPane.rowIndex="2" GridPane.columnIndex="1" blendMode="OVERLAY" />
        <TextField fx:id="testOutput" GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="3" />
   </children>
   <columnConstraints>
      <ColumnConstraints prefWidth="125.0" />
   </columnConstraints>
   <rowConstraints>
      <RowConstraints prefHeight="50.0" />
   </rowConstraints>
   <padding>
      <Insets bottom="10.0" left="9.0" right="10.0" top="10.0" />
   </padding>

</GridPane>

让我的testController控制两个不同的FXML,是一个问题吗?

共有1个答案

宋英杰
2023-03-14

fxmlloader尝试加载fxml文件时,它将在fxml文件中创建用fx:controller定义的控制器类的新实例。然后创建@fxml带注释的字段,并将其与fxml文件中的fx:id组件进行映射。最后,它调用控制器的initialize()方法。您可以在fxmlLoader.load()之后使用fxmlLoader.getController()获得实例化的控制器。

根据这个基本工作流,代码中的缺陷是:
MyMain.fxml的控制器是TestController,但MyMain.fxml不包含具有fx:id colFirstName等的TableColumns,因此当MyMain.fxml加载后,这些字段为空。因此,在尝试使用这些字段时,loadEmployeeForm()中将存在NPE。

将TableView和TableColumns移动到frMemployees.fxml的控制器中,并在该控制器的initialize()方法中配置它们(setCellValueFactory、initial data等)。

 类似资料:
  • 在我的中,值之一是。为了简化事情,它只包含值。在我的列的单元格值工厂中,我使用类将这些值连接在一起。 我想要的结果应该是一个StringExpression,它会在ObservableList更改时更新。 我遇到的问题是,当列表中的任何值发生更改时,生成的StringExpression会正确更新,但当我向列表中添加或删除值时,它不会更新。 我的第一个想法是向行中添加一个ListChangeLis

  • 问题内容: 我在TableView中添加了默认的TEST1和TEST2作为Name Col,但是在运行它时却没有显示。这是我使用过的两个类和一个fxml,有人可以给我一些有关此问题的建议吗? 仅一个包调用:controllerJBoxFXTest 第一类MainView.class包controllerJBoxFXTest; 在第二个MainController.java中,可以看到我添加了TES

  • 因此,我使用javafx创建了这个应用程序,它有一个登录屏幕,但我在这方面没有任何成功,我已经在这个项目的这个小部分工作了一些天,它根本不能以任何方式工作。我尝试这样做,我看了一些教程,其中大部分都是像下面的代码一样,但它对我来说不起作用,如果有人能帮我解释为什么我的标签文本没有改变(这就是我如何测试登录是否成功),这将是很好的,下面是代码: 控制器: FXML格式

  • 问题内容: 为什么JavaFX中没有ObservableQueue?如果我们查看FXCollection的Java 9文档(只是看一下8的变化),我们会看到用于创建Observable集,列表和映射的静态助手方法。还有一些创建Observable float和integer数组的方法。但是,无法创建ObservableQueue。Java中的Queue接口具有许多有趣的实现,包括ArrayDequ

  • 我有一个表,它只包含列ID和name。但是,这个表被嵌入到一个SplitPane中,让用户有机会轻松快速地更改大小。我希望桌子总是在整个宽度内填满。ID列的大小设置为70,并且只有Name列应该始终传播到表的剩余宽度。我使用FXML创建布局。有没有可能直接在FXML中设置这个?

  • 问题内容: 我有Ubuntu 10.10和apache2,php 5.3.3-1和mysql 5.1。 我正在通过URL向页面传递一些值。在该页面上,如果我这样做了,那么我会看到数组的内容。但是,如果我这样做数组是空的。任何想法为什么会这样? 问题答案: 也可以尝试检查php.ini中的“ request_order” 选项: