2016-08-25 16 views
0

私は数時間絶望的にこれを試してみることを試みてきましたが、私は運がないです。私が情報を入力して「従業員を保存」ボタンを押すと、中央のテーブルがそれに応じて更新されるという考えがあります。私は、この方法が、私がテーブルとリストを作成した方法に何か間違っていると信じさせるようになっていることを知っています。テーブルに追加できません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); 
    } 
} 

おかげ

+0

これは、コントローラクラスですか?もしそうなら、なぜあなたは 'TableView'インスタンスを作成していますか?レイアウトにこのテーブルを追加していないようです。プロジェクト全体にリンクするのではなく、コードが完全であるように、質問のコードを更新してください。不要なものはすべて削除してください。テーブルビュー、列のみが必要です。同様に、列の場合と同様に、モデルクラスのプロパティの数を1つまたは2つに減らすことができます。アイテムをハードコーディングして 'initialize()'メソッドでテーブルに追加するだけです。それは問題を再現するのに十分なはずです(もしそうでなければ、あなたはそれを解決する途中です)。 –

+0

@ James_D、コントローラクラスyesの一部です。そのインスタンスを作成する前に、私はnullポインタを取得していました。私は本当にこれを小さなコードで再現する方法を知りたがっていますが、私は正直なところそうではありません。私はJavaFXを使い始めました。 – SkyPlus

+1

[MCVE]を作成するには、前のコメントで述べたことを試してみてください。あなたがFXMLの 'fx:id'がフィールド名 'employeeTable'と一致しないか、または何かがFXML注入に間違っているためにヌルポインタ例外が発生しているとします。表示されない完全に新しいテーブルを作成することは、問題を修正するつもりはありません... –

答えて

3

。私。

// add @FXML annotation 
@FXML 
private TableView<Employee> employeeTable; 

<!-- note fx:id attribute --> 
<TableView fx:id="employeeTable" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER"> 

、その後、あなたはinitialize()方法でテーブルにデータを設定することができます。

@Override 
public void initialize(URL location, ResourceBundle resources) { 

    nameColumn.setCellValueFactory(dataCell -> dataCell.getValue().nameProperty()); 
    wageColumn.setCellValueFactory(dataCell -> dataCell.getValue().wageProperty().asObject()); 

    employeeTable.setItems(employeeList); 
} 
+0

ああ私の神はあなたにそんなに感謝します!このような単純な見落としが私にとって非常に多くの時間を要したと考えるかのように、私はこれを学ぶすべての部分を推測します。機能は現在意図したとおりに動作します。繰り返しますが、すばやく丁寧な返信をいただきありがとうございます。 – SkyPlus

+0

あなたのコントローラ内の何かがnullの場合は、通常は 'fx:id'が間違っているか、' @ FXML'(またはその両方)がないためです。 –

+0

カードの上に書かれて、これを確かに覚えている私は確かに! – SkyPlus

関連する問題