JavaFX表列,SceneBuilder未填充

时间:2016-10-29 21:25:33

标签: javafx scenebuilder

我一直在看教程,我似乎无法填写表格。 我也在使用net beans和scenebuilder。 任何帮助将不胜感激!一直在挣扎5个小时。

以下是Controller类的代码:

public class FXMLDocumentController implements Initializable {

    @FXML
    private TableView<Table> table;
    @FXML
    private TableColumn<Table, String> countriesTab;

    /**
     * Initializes the controller class.
     */

    ObservableList<Table> data = FXCollections.observableArrayList(
            new Table("Canada"),
            new Table("U.S.A"),
            new Table("Mexico")
    );

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        countriesTab.setCellValueFactory(new PropertyValueFactory<Table, String>("rCountry"));
        table.setItems(data);
    }
}

以下是Table

的代码
class Table {
    public final SimpleStringProperty rCountry;


    Table(String country){
        this.rCountry = new SimpleStringProperty(country);
    }

    private SimpleStringProperty getRCountry(){
        return this.rCountry;

    }
}

这是我的主要内容:

public class Assignment1 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

1 个答案:

答案 0 :(得分:2)

PropertyValueFactory找到属性,项目类(在本例中为Table)需要public作为访问修饰符,而不是包私有。返回属性的方法也需要public

此外,根据<nameOfProperty>Property工作所需的约定,返回属性本身的方法的正确名称为PropertyValueFactory

此外,由于属性的实际类型是实现细节,因此使用StringProperty作为返回类型而不是SimpleStringProperty

会更好。
public class Table {

    private final SimpleStringProperty rCountry;

    public Table(String country){
        this.rCountry = new SimpleStringProperty(country);
    }

    public StringProperty rCountryProperty() {
        return this.rCountry;
    }
}

如果您使用这些修饰符来阻止对该属性的写访问权限,您仍然可以使用ReadOnlyStringWrapper并返回ReadOnlyStringProperty来实现此效果:

public class Table {

    private final ReadOnlyStringWrapper rCountry;

    public Table(String country){
        this.rCountry = new ReadOnlyStringWrapper (country);
    }

    public ReadOnlyStringProperty rCountryProperty() {
        return this.rCountry.getReadOnlyProperty();
    }
}

如果根本没有对该属性的写访问权限,只需使用该属性的getter就足够了。在这种情况下,您根本不需要使用StringProperty

public class Table {

    private final String rCountry;

    public Table(String country){
        this.rCountry = country;
    }

    public String getRCountry() {
        return this.rCountry;
    }
}