私は数時間絶望的にこれを試してみることを試みてきましたが、私は運がないです。私が情報を入力して「従業員を保存」ボタンを押すと、中央のテーブルがそれに応じて更新されるという考えがあります。私は、この方法が、私がテーブルとリストを作成した方法に何か間違っていると信じさせるようになっていることを知っています。テーブルに追加できません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>
メイン:
あなたが他のコントロールを行っているのと同じ方法で、コントローラにTableView
を注入する必要があるの
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'インスタンスを作成していますか?レイアウトにこのテーブルを追加していないようです。プロジェクト全体にリンクするのではなく、コードが完全であるように、質問のコードを更新してください。不要なものはすべて削除してください。テーブルビュー、列のみが必要です。同様に、列の場合と同様に、モデルクラスのプロパティの数を1つまたは2つに減らすことができます。アイテムをハードコーディングして 'initialize()'メソッドでテーブルに追加するだけです。それは問題を再現するのに十分なはずです(もしそうでなければ、あなたはそれを解決する途中です)。 –
@ James_D、コントローラクラスyesの一部です。そのインスタンスを作成する前に、私はnullポインタを取得していました。私は本当にこれを小さなコードで再現する方法を知りたがっていますが、私は正直なところそうではありません。私はJavaFXを使い始めました。 – SkyPlus
[MCVE]を作成するには、前のコメントで述べたことを試してみてください。あなたがFXMLの 'fx:id'がフィールド名 'employeeTable'と一致しないか、または何かがFXML注入に間違っているためにヌルポインタ例外が発生しているとします。表示されない完全に新しいテーブルを作成することは、問題を修正するつもりはありません... –