JavaFX 将数据添加到表中

标签 java mysql javafx scenebuilder

我正在尝试将数据添加到 JavaFX 表中。

我有一个类 GameOfThronesCharacter。我创建了它的几个实例,并尝试将其数据插入到 JavaFX 表中。

该表是在 FX scenebuilder 中制作的,fxml 文件链接在 main 中。 这是练习,我计划在完成这部分后将其链接到 mysql 表,而不是硬编码 GoTC。

该表的行为非常奇怪,就像创建了第二个表一样。 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;
    }       
}

最佳答案

在 FXML 文件中,您创建表列并将它们添加到表的 列表中:

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

然后,在 Controller 中创建一组全新的列,并将所有这些添加到表的列表中:

@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);

}

因此,毫不奇怪,您最终会得到一组重复的列。

只需删除创建第二组列的代码即可。 (顺便说一句,最好将这些字段公开,并通过注释 @FXML 使其可供 FXMLLoader 访问):

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());

    }
}

关于JavaFX 将数据添加到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41304198/

相关文章:

java - 具有 BorderPane 的应用程序不显示简单按钮

java - 故意在 JavaFX windows 应用程序上重现应用程序崩溃 "Application has Stopped Working"

java - GCM android 客户端不工作

java - 为什么方法引用可以使用非最终变量?

java - mysql语句未正确排序多列的总和

php - Mysql_fetch_data 意外打印

java - JavaFX GUI 中的关注点分离

在 eclipse 中打开 xml 文件时出现 java.lang.NullPointerException

java - 查找包含给定坐标的区域

php - PHP/Mysql 从多个表中选择数据