2016-08-25 2 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> 

Главная:

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»? Кажется, вы не добавляете эту таблицу в макет где-нибудь. И, пожалуйста, обновите код в своем вопросе, чтобы он был полным, а не связывался со всем проектом. Удалите все ненужное. Вам нужно только представление таблицы, столбцы, и вы можете предположительно уменьшить количество свойств в классе модели до одного или двух, аналогично для столбцов. Просто скопируйте элемент и добавьте его в таблицу в методе 'initialize()'. Этого должно быть достаточно, чтобы воспроизвести проблему (а если нет, вы на полпути к ее решению). –

+0

@James_D, это часть класса контроллера да. До создания этого экземпляра я получал нулевые указатели. Мне очень жаль, что я не знал, как воссоздать это в меньшем и полном одиночном коде, но, честно говоря, нет. Я только начинаю работать на JavaFX. – SkyPlus

+1

Чтобы создать [MCVE], просто попробуйте, что я сказал в предыдущем комментарии. Если вы получаете исключения с нулевым указателем, это потому, что 'fx: id' в вашем FXML не соответствует имени поля 'employeeTable' или что-то еще не так с вложением FXML. Создание абсолютно новой таблицы, которая никогда не отображается, не решит проблему ... –

ответ

3

Вы должны вводить TableView в контроллер, так же, как вы делаете с другими элементами управления. То есть

// 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

Написано на карточке, запомнит это Im уверенно! – SkyPlus

Смежные вопросы