2016-12-23 2 views
0

Я пытаюсь добавить данные в таблицу JavaFX.JavaFX добавить данные в таблицу

У меня есть класс GameOfThronesCharacter. Я сделал несколько экземпляров, и я пытаюсь вставить эти данные в таблицу JavaFX.

Таблица была сделана в FX scenbuilder, а файл fxml связан в основном. Это практика, я планирую связать ее с таблицей mysql вместо hardcoding GoTCs, когда я получу эту часть.

Таблица действует очень странно и, как создание второго стола. https://youtu.be/1JVraOXVPIk

Я не знаю, что я испортил, кто-нибудь может мне помочь? вот код:

Main.java

public class Main extends Application { 

static Stage window; 
static Scene FrontEnd; 

@Override 
public void start(Stage primaryStage)throws IOException { 
    window = primaryStage; 
    initialize(); 

     window.setTitle("Database Interface v1.0"); 
     window.setResizable(true); 
     window.setScene(FrontEnd); 
     window.show(); 
} 

private void initialize() throws IOException { 
    FrontEnd = new Scene(FXMLLoader.load(getClass().getResource("Frontend.fxml"))); 
    FrontEnd.getStylesheets().add("application.css"); 
} 

public static void main(String[] args) { 
    launch(args); 
    } 
} 

FrontEnd.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 

<Pane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.FrontEndController"> 
    <children> 
     <TableView fx:id="table"> 
     <columns> 
      <TableColumn fx:id="deletionColumn" editable="false" prefWidth="75.0" text="Delete" /> 
      <TableColumn fx:id="nameColumn" editable="false" prefWidth="75.0" text="Name" /> 
      <TableColumn fx:id="allegianceColumn" editable="false" prefWidth="75.0" text="Allegiance" /> 
      <TableColumn fx:id="positionColumn" editable="false" prefWidth="75.0" text="Position" /> 
      <TableColumn fx:id="salaryColumn" editable="false" prefWidth="75.0" text="Salary" /> 
     </columns> 
     </TableView> 
    </children> 
</Pane> 

FrontEndController.java

public class FrontEndController implements Initializable { 

    public TableView<GameOfThronesCharacter> table; 
    public TableColumn<GameOfThronesCharacter,String> nameColumn; 
    public TableColumn<GameOfThronesCharacter,String> allegianceColumn; 
    public TableColumn<GameOfThronesCharacter,String> positionColumn; 
    public TableColumn<GameOfThronesCharacter,Double> salaryColumn; 



    private ObservableList<GameOfThronesCharacter> getCharacters(){ 
     ObservableList<GameOfThronesCharacter> characters = FXCollections.observableArrayList(); 
     characters.add(new GameOfThronesCharacter("Cersei","Lannister","Queen Regent",100000)); 
     characters.add(new GameOfThronesCharacter("Jaime","Lannister","King Slayer",80000)); 
     characters.add(new GameOfThronesCharacter("Tyrion","Lannister","Queen's Hand",60000)); 

     return characters; 
    } 



    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     //nameColumn 
     nameColumn = new TableColumn<>("Name"); 
     nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); 

     //allegianceColumn 
     allegianceColumn = new TableColumn<>("Allegiance"); 
     allegianceColumn.setCellValueFactory(new PropertyValueFactory<>("allegiance")); 

     //positionColumn 
     positionColumn = new TableColumn<>("Position"); 
     positionColumn.setCellValueFactory(new PropertyValueFactory<>("position")); 

     //salaryColumn 
     salaryColumn = new TableColumn<>("Salary"); 
     salaryColumn.setCellValueFactory(new PropertyValueFactory<>("salary")); 

     //table = new TableView<>(); 
     table.setItems(getCharacters()); 
     table.getColumns().addAll(nameColumn,allegianceColumn,positionColumn,salaryColumn); 

    } 
} 

GameOfThronesCharacter.java

public class GameOfThronesCharacter { 

    private String name; 
    private String allegiance; 
    private String position; 
    private double salary; 

    public GameOfThronesCharacter(){ 
    } 

    public GameOfThronesCharacter(String name, String allegiance, String position, double salary){ 
     setName(name); 
     setAllegiance(allegiance); 
     setPosition(position); 
     setSalary(salary); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
      this.name = name; 
    } 

    public String getAllegiance() { 
     return allegiance; 
    } 

    public void setAllegiance (String allegiance){ 
      this.allegiance = allegiance; 
    } 

    public String getPosition() { 
     return position; 
    } 

    public void setPosition(String position) { 
      this.position = position; 
    } 

    public double getSalary() { 
     return salary; 
    } 

    public void setSalary(double salary) { 
     this.salary = salary; 
    }  
} 
+0

Почему вы создаете новый набор столбцов в контроллере и добавить их к Таблица? –

+0

@James_D Вероятно, он получил ошибку «null pointer exception», так как он не предисловил ни одну из своих переменных с помощью '@ FXML'. Который, btw OP, вы должны сделать. –

+1

@MichaelPickett Вам действительно не нужно, если поля являются 'public' (хотя они должны, конечно, быть' private'). –

ответ

1

В файле FXML, вы создаете столбцы таблицы и добавить их в список columns стола:

<TableView fx:id="table"> 
    <columns> 
     <TableColumn fx:id="deletionColumn" editable="false" prefWidth="75.0" text="Delete" /> 
     <TableColumn fx:id="nameColumn" editable="false" prefWidth="75.0" text="Name" /> 
     <TableColumn fx:id="allegianceColumn" editable="false" prefWidth="75.0" text="Allegiance" /> 
     <TableColumn fx:id="positionColumn" editable="false" prefWidth="75.0" text="Position" /> 
     <TableColumn fx:id="salaryColumn" editable="false" prefWidth="75.0" text="Salary" /> 
    </columns> 
    </TableView> 

Затем в контроллере можно создать целый новый набор столбцов, и добавить все те, columns список стола:

@Override 
public void initialize(URL arg0, ResourceBundle arg1) { 
    //nameColumn 
    nameColumn = new TableColumn<>("Name"); 
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); 

    //allegianceColumn 
    allegianceColumn = new TableColumn<>("Allegiance"); 
    allegianceColumn.setCellValueFactory(new PropertyValueFactory<>("allegiance")); 

    //positionColumn 
    positionColumn = new TableColumn<>("Position"); 
    positionColumn.setCellValueFactory(new PropertyValueFactory<>("position")); 

    //salaryColumn 
    salaryColumn = new TableColumn<>("Salary"); 
    salaryColumn.setCellValueFactory(new PropertyValueFactory<>("salary")); 

    //table = new TableView<>(); 
    table.setItems(getCharacters()); 
    table.getColumns().addAll(nameColumn,allegianceColumn,positionColumn,salaryColumn); 

} 

Итак, неудивительно, что вы получаете дублированный набор столбцов.

Просто удалите код, который создает второй набор столбцов. (Кстати, это лучше сделать поле общественности и сделать их доступными для FXMLLoader пути аннотирования их @FXML):

public class FrontEndController implements Initializable { 

    @FXML private TableView<GameOfThronesCharacter> table; 
    @FXML private TableColumn<GameOfThronesCharacter,String> nameColumn; 
    @FXML private TableColumn<GameOfThronesCharacter,String> allegianceColumn; 
    @FXML private TableColumn<GameOfThronesCharacter,String> positionColumn; 
    @FXML private TableColumn<GameOfThronesCharacter,Double> salaryColumn; 



    private ObservableList<GameOfThronesCharacter> getCharacters(){ 
     ObservableList<GameOfThronesCharacter> characters = FXCollections.observableArrayList(); 
     characters.add(new GameOfThronesCharacter("Cersei","Lannister","Queen Regent",100000)); 
     characters.add(new GameOfThronesCharacter("Jaime","Lannister","King Slayer",80000)); 
     characters.add(new GameOfThronesCharacter("Tyrion","Lannister","Queen's Hand",60000)); 

     return characters; 
    } 



    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     //nameColumn 
     nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); 

     //allegianceColumn 
     allegianceColumn.setCellValueFactory(new PropertyValueFactory<>("allegiance")); 

     //positionColumn 
     positionColumn.setCellValueFactory(new PropertyValueFactory<>("position")); 

     //salaryColumn 
     salaryColumn.setCellValueFactory(new PropertyValueFactory<>("salary")); 

     //table = new TableView<>(); 
     table.setItems(getCharacters()); 

    } 
} 
+0

Спасибо, Джеймс, это решило мою проблему и многое другое. Я не знал об аннотации FXML, чтобы быть честным, и обычно делал вещи публичными.Я как бы сам участвую в себе, и я скучаю совсем немного здесь и там, ценю помощь, хотя хороший сэр! – CoderP

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