【问题标题】:JavaFX - Displaying data within table view [duplicate]JavaFX - 在表视图中显示数据[重复]
【发布时间】:2019-09-12 23:35:37
【问题描述】:

我想在 GUI 的 tableview 中显示数据库中的数据。

我尝试了可能不同的方法都无济于事。代码运行没有错误,但表格视图中仍然没有显示任何内容。

您能否帮助澄清我对如何执行此操作的理解。


public class LeaderBoardView implements Initializable {

    @FXML private TableColumn<LeaderBoardData, String> colUsername;
    @FXML private TableColumn<LeaderBoardData, Integer> colWins;
    @FXML private TableColumn<LeaderBoardData, Integer> colWinPercentage;
    @FXML private TableView<LeaderBoardData> tableLeaderboard;
    private ObservableList<LeaderBoardData> data;


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

        colUsername.setCellValueFactory(
                new PropertyValueFactory<LeaderBoardData,String>("username"));
        colWins.setCellValueFactory(
                new PropertyValueFactory<LeaderBoardData, Integer>("wins"));
        colWinPercentage.setCellValueFactory(
                new PropertyValueFactory<LeaderBoardData, Integer>("winPercentage"));

        buildLeaderBoardData();

    }


    public void buildLeaderBoardData() {
        data = FXCollections.observableArrayList();
        try {
            ResultSet rs = UserDB.getLeaderBoardData();

            while(rs.next()){
                LeaderBoardData cm = new LeaderBoardData();

                cm.username.set(rs.getString("username"));
                cm.wins.set(rs.getInt("wins"));
                cm.winPercentage.set(rs.getInt("winPercentage"));
                data.add(cm);

                //System.out.println(data.get());
            }
            tableLeaderboard.setItems(data);

        } catch(Exception e) {
            e.printStackTrace();
            System.out.println("Error on Building Data");
        }
    }


public class LeaderBoardData {

    public SimpleStringProperty username;
    public SimpleIntegerProperty wins;
    public SimpleIntegerProperty winPercentage;


//    public UserData(String username, int wins, int winPercentage) {
//        this.username = new SimpleStringProperty(username);
//        this.wins = new SimpleIntegerProperty(wins);
//        this.winPercentage = new SimpleIntegerProperty(winPercentage);
//    }


    public String getUsername() {
        return username.get();
    }



    public Integer getUserWins() {
        return wins.get();
    }



    public Integer getWinPercent() {
        return winPercentage.get();
    }



}

预期结果 - 让表格视图显示用户、获胜、获胜百分比的排行榜

【问题讨论】:

    标签: java javafx tableview fxml


    【解决方案1】:

    每个 Java bean 属性名称都派生自相应 get 方法的名称,方法是删除 getdecapitalizing 方法名称的其余部分。不以任何方式考虑字段,只考虑方法。

    您的LeaderBoardData 类具有这些获取方法,它们对应于以下属性:

    • getUsername() → 属性"username"
    • getUserWins() → 属性"userWins"
    • getWinPercent() → 属性"winPercent"

    您必须完全使用上述属性名称:

    colUsername.setCellValueFactory(
            new PropertyValueFactory<LeaderBoardData,String>("username"));
    colWins.setCellValueFactory(
            new PropertyValueFactory<LeaderBoardData, Integer>("userWins"));
    colWinPercentage.setCellValueFactory(
            new PropertyValueFactory<LeaderBoardData, Integer>("winPercent"));
    

    更好的方法是完全避免反射。像你这样的反射错误不能被编译器捕获,但是直接调用方法的代码会被编译器检查。

    首先,您需要让LeaderBoardData 类以大多数JavaFX 类提供的标准方式提供属性:属性方法和get 方法(如果属性是可写的,则使用set 方法)。 javafx.scene.Node documentation 说明了这一点。

    在您的情况下,您的课程如下所示:

    public class LeaderBoardData {
    
        private StringProperty username = new SimpleStringProperty();
        private IntegerProperty wins = new SimpleIntegerProperty();
        private IntegerProperty winPercentage = new SimpleIntegerProperty();
    
        public StringProperty usernameProperty() {
            return username;
        }
    
        public String getUsername() {
            return username.get();
        }
    
        public void setUsername(String name) {
            this.username.set(name);
        }
    
        public IntegerProperty userWinsProperty() {
            return wins;
        }
    
        public int getUserWins() {
            return wins.get();
        }
    
        public void setUserWins(int wins) {
            this.wins.set(wins);
        }
    
        public IntegerProperty winPercentProperty() {
            return winPercentage;
        }
    
        public int getWinPercent() {
            return winPercentage.get();
        }
    
        public void setWinPercent(int percent) {
            this.winPercentage.set(percent);
        }
    }
    

    现在,您的单元格值工厂可以使用显式方法调用:

    colUsername.setCellValueFactory(f -> f.getValue().usernameProperty());
    colWins.setCellValueFactory(f -> f.getValue().userWinsProperty());
    colWinPercentage.setCellValueFactory(f -> f.getValue().winPercentProperty());
    

    【讨论】:

    • 感谢您的回答。结束了数小时的挫败感。
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多