The table cells are empty in my tableview. JavaFX + Scenebuilder

后端 未结 2 1669
借酒劲吻你
借酒劲吻你 2020-12-04 00:50

I am trying to get the table cells to show the string when i create new rows. But all the rows are just empty. Do anyone know what i am doing wrong? Here is the main class:

相关标签:
2条回答
  • 2020-12-04 01:22

    in stringproperty you gotto add asobjects() method after cellData.getValue().bPlayerIDProperty())... so I hope that would help

    0 讨论(0)
  • 2020-12-04 01:31

    The names of your get methods are wrong. According to the PropertyValueFactory documentation, if you pass in a property name of "xyz", the property value factory will first look for a method xyzProperty() belonging to the object in the table row. If it doesn't find that, it will fall back on looking for a method called getXyz() (carefully look at the capitalization there), wrapping the result in a ReadOnlyObjectWrapper.

    So the following would work:

    package application;
    
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    
    public class Table {
    
        private final SimpleIntegerProperty bPlayerID;
        private final SimpleStringProperty bLeague;
        private final SimpleStringProperty bName;
    
        public Table(int cPlayerID, String cLeague, String cName) {
            this.bPlayerID = new SimpleIntegerProperty(cPlayerID);
            this.bLeague = new SimpleStringProperty(cLeague);
            this.bName = new SimpleStringProperty(cName);
        }
    
        public int getBPlayerID() {
            return bPlayerID.get();
        }
        public void setBPlayerID(int v) {
            bPlayerID.set(v);
        }
        public String getBLeague() {
            return bLeague.get();
        }
        public void setBLeague(String v) {
            bLeague.set(v);
        }
        public String getBName() {
            return bName.get();
        }
        public void setBName(String v) {
            bName.set(v);
        }
    }
    

    However, as stated in the PropertyValueFactory documentation, the properties in this case would not be "live": in other words if the values change, the table will not automatically update. Additionally, if you wanted to make the table editable, it wouldn't update the properties without some explicit wiring to call the set methods.

    It's better to define your table model using the outline in the Properties and Bindings tutorial:

    package application;
    
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    
    public class Table {
    
        private final IntegerProperty bPlayerID;
        private final StringProperty bLeague;
        private final StringProperty bName;
    
        public Table(int cPlayerID, String cLeague, String cName) {
            this.bPlayerID = new SimpleIntegerProperty(cPlayerID);
            this.bLeague = new SimpleStringProperty(cLeague);
            this.bName = new SimpleStringProperty(cName);
        }
    
        public int getBPlayerID() {
            return bPlayerID.get();
        }
        public void setBPlayerID(int v) {
            bPlayerID.set(v);
        }
        public IntegerProperty bPlayerIDProperty() {
            return bPlayerID ;
        }
    
        public String getBLeague() {
            return bLeague.get();
        }
        public void setBLeague(String v) {
            bLeague.set(v);
        }
        public StringProperty bLeagueProperty() {
            return bLeague ;
        }
    
        public String getBName() {
            return bName.get();
        }
        public void setBName(String v) {
            bName.set(v);
        }
        public StringProperty bNameProperty() {
            return bName ;
        }
    }
    

    If you do that, then (in Java 8) you can use the following cell value factories, instead of the PropertyValueFactory:

    aPlayerID.setCellValueFactory(cellData -> cellData.getValue().bPlayerIDProperty());
    

    which will allow the compiler to catch any errors, instead of it just failing silently at runtime.

    0 讨论(0)
提交回复
热议问题