Javafx 8:在初始化方法中填充 TableView

Posted

技术标签:

【中文标题】Javafx 8:在初始化方法中填充 TableView【英文标题】:Javafx 8 : Populating a TableView in initialize method 【发布时间】:2017-04-10 13:45:49 【问题描述】:

我是 JavaFX 8 的新手,我正在尝试使用初始化方法为 TableView 提供控制器中的一些数据。 我已经看到了很多关于它的主题,尝试了很多东西,但它对我没有用。 我见过:

How to populate TableView dynamically with FXML and JavaFX How to populate a TableView that is defined in an fxml file that is designed in JavaFx Scene Builder Javafx PropertyValueFactory not populating Tableview

还有很多,但没有一个解决方案碰巧对我有用。

这是我的代码: 类员工

public class Employee extends Person

private SimpleIntegerProperty salary;
private SimpleObjectProperty<Character> droit;

public Employee()
    super();
    this.salary = new SimpleIntegerProperty();
    this.droit = new SimpleObjectProperty<Character>();


public Employee(int id, String firstName, String lastName, String password, char droits, int salary) 
    super(id,firstName,lastName,password);
    this.salary = new SimpleIntegerProperty(salary);
    this.droit = new SimpleObjectProperty<Character>(droits);


public Employee(String firstName, String lastName, String password, char droits, int salary) 
    super(firstName,lastName,password);
    this.salary = new SimpleIntegerProperty(salary);
    this.droit = new SimpleObjectProperty<Character>(droits);


...


类人

public class Person 

protected SimpleStringProperty firstName;
protected SimpleStringProperty lastName;

public Person()
this.firstName = new SimpleStringProperty();
this.lastName = new SimpleStringProperty(); 



public Person(String firstName, String lastName)
    this.firstName = new SimpleStringProperty(firstName);
    this.lastName = new SimpleStringProperty(lastName);


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


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


public StringProperty firstNameProperty()
    return this.firstName;


public String getLastName() 
    return this.lastName.get();


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


public StringProperty lastNameProperty()
    return this.lastName;

这是定义用户界面的 FXML:

咨询HR.fxml

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

    <VBox fx:id="ConsultHR" maxHeight="600.0" maxWidth="600.0" minHeight="500.0" minWidth="500.0" prefHeight="550.0" prefWidth="550.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.kaf.app.controller.hr.ConsultHRController">
        <children>
            <HBox maxHeight="450.0" minHeight="450.0" prefHeight="450.0">
                <children>
                    <TableView fx:id="table" prefHeight="426.0" prefWidth="288.0">
                        <columns>
                            <TableColumn fx:id="lastNameCol" prefWidth="131.0" text="Nom" />
                            <TableColumn fx:id="firstNameCol" prefWidth="154.0" text="Prénom" />
                        </columns>
                    </TableView>
                </HBox>
                    <ButtonBar prefHeight="40.0" prefWidth="400.0">
                        <buttons>
                            <Button mnemonicParsing="false" onAction="#goHRAction" text="Rssources Humaines" />
                        </buttons>
                        <VBox.margin>
                            <Insets right="15.0" />
                        </VBox.margin>
               </ButtonBar>
            </children>
        </VBox>

最后是控制器: ** 类 ConsultHRController **

    public class ConsultHRController extends DefaultController implements Initializable

    @FXML
    VBox ConsultHR;

    @FXML
    public TableView<Employee> table;

    @FXML
    TableColumn<Employee,String> firstNameCol;

    @FXML
    TableColumn<Employee,String> lastNameCol;

    DAO<Employee> dao;

    SimpleListProperty<Employee> employees;

    @Override
    public void initialize(URL location, ResourceBundle resources)
        super.initialize();
        dao = (DAO<Employee>) dFact.getEmployeeDAO();
        try 
            employees = dao.findAll();
            System.out.println(employees.get());    
            table =new TableView<Employee>(employees);
            firstNameCol.setCellValueFactory(new PropertyValueFactory<Employee, String>("firstName"));
            lastNameCol.setCellValueFactory(new PropertyValueFactory<Employee, String>("lastName"));
            table.getColumns().setAll(firstNameCol, lastNameCol);
            System.out.println(firstNameCol.getCellData(0));
         catch (SQLException e) 
            // TODO Mettre une popup erreur base de données
            e.printStackTrace();
        

    

    public void goHRAction(ActionEvent e) throws IOException
        goSmwhereAction((Stage) ConsultHR.getScene().getWindow(),"/fr/kaf/app/fxml/hr/HumanRessources.fxml");   
    


如您所见,我有一个“System.out.println(firstNameCol.getCellData(0));”在初始化方法中。结果是单元格不是空的,并且填充了良好的数据,但我在 UI 中看不到任何内容。

【问题讨论】:

属性字段在哪里分配??? 我每个类都有一个构造函数,我没有放在这里,以免污染代码的重要部分。我会更新它以使其更清晰。 【参考方案1】:

您在 initialize 方法中替换您的 TableView

table =new TableView<Employee>(employees);

您将数据分配给新的TableView,并将从 fxml 创建的数据留空。

改用FXMLLoader注入的那个:

@Override
public void initialize(URL location, ResourceBundle resources)
    super.initialize();
    dao = (DAO<Employee>) dFact.getEmployeeDAO();
    try 
        employees = dao.findAll();

        // set data for the table created by the FXMLLoader
        table.setItems(employees);

        // no need to add them to the table since the FXMLLoader is ready doing that
        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
     catch (SQLException e) 
        // TODO Mettre une popup erreur base de données
        e.printStackTrace();
    


【讨论】:

非常感谢!它现在可以工作了,我仍然不明白为什么实例化一个新的 TableView 不起作用,它应该重新实例化 FXML 加载器注入的那个,对吗?再次感谢您的建议 @Kyle_jumpen:它用新的TableView 覆盖该字段的值。这并不意味着它以任何方式修改场景。旧的TableView 仍然是HBox 的子代。它类似于以下场景:您有一个List listObject v = list.get(0); v = "Hello World"; 此代码中的列表从未被修改过 sn -p;仅修改用于存储第一个元素值的变量的值。 我明白了!我不知道注射是如何工作的。再次感谢。

以上是关于Javafx 8:在初始化方法中填充 TableView的主要内容,如果未能解决你的问题,请参考以下文章

javafx 8在textarea中编辑文本

如何使用自定义对象在 JavaFX 中填充 ListView?

单击时在JavaFX中填充组合框

JavaFX - 未填充文本区域时发出警报

如何在 JavaFX 的 GridPane 中删除“幽灵线”?

在 JavaFX 中使用数据库填充表视图