Я пытался безнадежно часами пытаться понять это, но мне не повезло. Идея заключается в том, что при вводе информации и нажатии кнопки «Сохранить сотрудника» таблица в центре должна обновляться соответствующим образом. Я знаю, что метод этого достигается, что заставляет меня думать, что что-то не так с тем, как я создал таблицу и список.Невозможно добавить в таблицу JavaFXML
Отредактировано miminal Код:
Контроллер:
package application;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
public class Controller implements Initializable {
@FXML // fx:id="nameField"
private TextField nameField;
@FXML // fx:id="wageField"
private TextField wageField;
@FXML // fx:id="saveBtn"
private Button saveBtn;
@FXML // fx:id="nameColumn"
private TableColumn<Employee, String> nameColumn;
@FXML // fx:id="wageColumn"
private TableColumn<Employee, Double> wageColumn;
private TableView<Employee> employeeTable;
ObservableList<Employee> employeeList = FXCollections.observableArrayList();
@Override
public void initialize(URL location, ResourceBundle resources) {
nameColumn.setCellValueFactory(dataCell -> dataCell.getValue().nameProperty());
wageColumn.setCellValueFactory(dataCell -> dataCell.getValue().wageProperty().asObject());
}
public void saveButtonClick() {
Employee employee = new Employee();
employee.setName(nameField.getText());
employee.setWage(Double.parseDouble(wageField.getText()));
employeeList.add(employee);
}
}
Сотрудник:
package application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Employee {
private StringProperty name = new SimpleStringProperty(this, "name", "");
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
public void setName(String name) {
this.name.set(name);
}
private DoubleProperty wage = new SimpleDoubleProperty(this, "wage", 0.0);
public Double getWage() {
return wage.get();
}
public DoubleProperty wageProperty() {
return wage;
}
public void setWage(Double wage) {
this.wage.set(wage);
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?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.VBox?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
<center>
<TableView prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn fx:id="nameColumn" prefWidth="75.0" text="Name" />
<TableColumn fx:id="wageColumn" prefWidth="75.0" text="Wage" />
</columns>
</TableView>
</center>
<left>
<VBox prefHeight="200.0" prefWidth="100.0" BorderPane.alignment="CENTER">
<children>
<Label text="Add new Entry" />
<TextField fx:id="nameField" promptText="name" />
<TextField fx:id="wageField" promptText="wage" />
<Button fx:id="saveBtn" mnemonicParsing="false" onAction="#saveButtonClick" text="save new entry" />
</children>
</VBox>
</left>
</BorderPane>
Главная:
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("debug.fxml"));
primaryStage.setTitle("Minimal Debug");
primaryStage.setScene(new Scene(root, 1920, 1080));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Благодаря
Является ли это класс контроллера? Если да, то почему вы создаете экземпляр «TableView»? Кажется, вы не добавляете эту таблицу в макет где-нибудь. И, пожалуйста, обновите код в своем вопросе, чтобы он был полным, а не связывался со всем проектом. Удалите все ненужное. Вам нужно только представление таблицы, столбцы, и вы можете предположительно уменьшить количество свойств в классе модели до одного или двух, аналогично для столбцов. Просто скопируйте элемент и добавьте его в таблицу в методе 'initialize()'. Этого должно быть достаточно, чтобы воспроизвести проблему (а если нет, вы на полпути к ее решению). –
@James_D, это часть класса контроллера да. До создания этого экземпляра я получал нулевые указатели. Мне очень жаль, что я не знал, как воссоздать это в меньшем и полном одиночном коде, но, честно говоря, нет. Я только начинаю работать на JavaFX. – SkyPlus
Чтобы создать [MCVE], просто попробуйте, что я сказал в предыдущем комментарии. Если вы получаете исключения с нулевым указателем, это потому, что 'fx: id' в вашем FXML не соответствует имени поля 'employeeTable' или что-то еще не так с вложением FXML. Создание абсолютно новой таблицы, которая никогда не отображается, не решит проблему ... –