【问题标题】:Java FXML Tableview with ArrayList带有 ArrayList 的 Java FXML Tableview
【发布时间】:2019-06-14 09:15:56
【问题描述】:

大家好,我正在尝试为大学项目的 Jump&Run 游戏制作记分表,我正在将具有 nicknamefinalScore 属性的 Player 类的数据保存在 ArrayList 中。我想在 FXML TableView 中显示数据,但它不起作用,只显示没有内容。

我已经尝试将属性声明为SimpleString/IntegerPropertys 但它没有改变。

public class ScoreController implements Initializable {

    @FXML
    private TableView<Player> table;
    @FXML
    private TableColumn<Player, String> Nickname;
    @FXML
    private TableColumn<Player, Integer> Score;

    // Creating Observable Array List
    private ObservableList<Player> data = FXCollections.observableArrayList();

    // Set up the Scene
    private Parent scoreList;

    void setUp() throws Exception{
        scoreList = FXMLLoader.load(getClass().getResource("/fxml/Score.fxml"));
        App.scoreList = new Scene(scoreList,800,500);
    }


    // Adding data to the Observable List and setting Column Factories
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        data.add(new Player("Chris", 11));
        data.add(new Player("Agil", 12));
        Nickname.setCellValueFactory(new PropertyValueFactory<Player, String>("nickname"));
        Score.setCellValueFactory(new PropertyValueFactory<Player, Integer>("finaleScore"));
        table.setItems(data);
    }
}

我希望 TableColumn 显示 ArrayList 的数据,但 TableView 在此表中仅显示“无内容”。

编辑播放器类

public Player(String nickname, int finalScore){
    setNickname(nickname);
    setFinalScore(finalScore);
}
public void setNickname(String nickname) {
    this.nickname = nickname;
}
void setFinalScore(int score){
    finalScore = score;
}
public String getNickname(){
    return nickname;
}
public int getFinalScore() {
    return finalScore;
}

【问题讨论】:

  • 向我们展示类 Player 我认为您将 get/setter 命名为错误
  • 很可能是duplicate - PropertyValueFactory 的不当使用(正如@Raw 已经指出的那样)。无论如何,要获得调试帮助,您必须提供一个证明问题的minimal reproducible example。与您的问题无关:请学习 java 命名约定并遵守它们

标签: java javafx


【解决方案1】:

你可以尝试一些改变

 Nickname.setCellValueFactory(col ->new SimpleStringProperty(col.getValue().getNickName());
 Score.setCellValueFactory(col ->new SimpleIntegerProperty(col.getValue().getFinalScore());

如果它有效,您必须查看 cellFactory 的命名约定

【讨论】:

    【解决方案2】:

    我已经试用了您的代码,这就是我认为的问题:

    Score.setCellValueFactory(new PropertyValueFactory&lt;Player, Integer&gt;("finaleScore"));

    您将finalScore 错误输入为finaleScore,因为这样的属性不存在,所以它不返回任何值。但是,这不会影响 Nickname 列的值的填充。所以我的第二个猜测是你可能没有为 fxml 文件设置控制器。请检查您的 Score.fxml 代码中是否有以下行:

    fx:controller="<your package name here >.ScoreController"
    

    例如

    <AnchorPane prefHeight="400.0" prefWidth="600.0" fx:controller="com.example.ScoreController">
    
    <!-- other children nodes here  -->
    
    </AnchorPane>
    

    编辑

    尝试将这些行更改为:

        @FXML
        public TableView table;
        @FXML
        public TableColumn Nickname;
        @FXML
        public TableColumn Score;
    
    

    【讨论】:

    • 感谢您的帮助,但不幸的是它仍然不起作用我已经在我的 FXML 中设置了控制器。
    • 我已经编辑了答案以尝试其他方法。
    • 仍然没有区别,但感谢您的努力 :)
    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 2012-05-03
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2016-10-02
    • 2012-03-25
    相关资源
    最近更新 更多