繁体   English   中英

JavaFX-TableView不会更新项目

[英]JavaFX - TableView doesn't update items

我正在为使用JavaFX的妻子编程一些词汇训练器。 每个单词都存储自己的统计值,例如她遇到该单词的频率以及提供正确答案的频率。 我已经为此设置了一个TableView,但是在训练之后,统计信息将不会更新。 单词对象本身具有正确的值,但它们只是未在TableView中显示。 通常,由于ObservableList的性质,TableView总是显示on对象的当前值,对吗? 但是在这种情况下不是。

这是我的单词课:

public class Vocable
{
    private String german;
    private String english;
    private int givenAnswers, correctAnswers, skippedAnswers;

    public Vocable(String ger, String eng)
    {
        german = ger;
        english = eng;
        givenAnswers = 0;
        correctAnswers = 0;
        skippedAnswers = 0;
    }

    public String getGerman()
    {
        return german;
    }

    public String getEnglish()
    {
        return english;
    }

    public int getGivenAnswers() 
    {
        return givenAnswers;
    }

    public void increaseGivenAnswers() 
    {
        this.givenAnswers++;;
    }

    public int getCorrectAnswers() 
    {
        return correctAnswers;
    }

    public void increaseCorrectAnswers() 
    {
        this.correctAnswers++;
    }

    public int getSkippedAnswers() 
    { 
        return skippedAnswers;
    }

    public void increaseSkippedAnswers() 
    {
        this.skippedAnswers++;
    }
}

这是我的View类:

public class OverviewView extends VBox
{
    private OverviewPresenter presenter;

    private TableView<Vocable> overviewTable;
    private TableColumn<Vocable, String> german;
    private TableColumn<Vocable, String> english;
    private TableColumn<Vocable, Number> given;
    private TableColumn<Vocable, Number> correct;
    private TableColumn<Vocable, Number> skipped;

    private Button delete, back, showStats, add;

    public OverviewView()
    {
        initView();
    }

    private void initView()
    {
        BorderPane pane = new BorderPane();

        overviewTable = new TableView<>();
        german = new TableColumn<>("German");
        english = new TableColumn<>("English");
        given = new TableColumn<>("given");
        correct = new TableColumn<>("correct");
        skipped = new TableColumn<>("skipped");

        german.setResizable(true);
        english.setResizable(true);
        given.setResizable(true);
        correct.setResizable(true);
        skipped.setResizable(true);

        delete = new Button("Delete");
        delete.setOnAction(e ->     presenter.deleteVocable(overviewTable.getSelectionModel().getSelectedItem()));

        back = new Button("Back");
        back.setOnAction(e -> presenter.showMainView());

        showStats = new Button("Statistics");
        showStats.setOnAction(e -> presenter.showStatistics());

        add = new Button("Add Vocbale");
        add.setOnAction(e -> presenter.showAddDialog());

        overviewTable.getColumns().add(german);
        overviewTable.getColumns().add(english);
        overviewTable.getColumns().add(given);
        overviewTable.getColumns().add(correct);
        overviewTable.getColumns().add(skipped);

        german.prefWidthProperty().bind(overviewTable.widthProperty().multiply(0.35));
        english.prefWidthProperty().bind(overviewTable.widthProperty().multiply(0.35));
        given.prefWidthProperty().bind(overviewTable.widthProperty().multiply(0.10));
        correct.prefWidthProperty().bind(overviewTable.widthProperty().multiply(0.10));
        skipped.prefWidthProperty().bind(overviewTable.widthProperty().multiply(0.10));

        pane.setCenter(overviewTable);

        HBox box = new HBox(50);
        box.getChildren().addAll(back, delete, add, showStats);

        pane.setBottom(box);
        BorderPane.setMargin(box, Constants.DEFAULT_BP_MARGINS);

        pane.setPadding(Constants.DEFAULT_PADDING);

        getChildren().add(pane);
    }

    public void setTableContent(ObservableList<Vocable> list)
    {
        overviewTable.setItems(list);

        german.setCellValueFactory(item -> new     SimpleStringProperty(item.getValue().getGerman()));
    english.setCellValueFactory(item -> new     SimpleStringProperty(item.getValue().getEnglish()));

        given.setCellValueFactory(item -> new     SimpleIntegerProperty(item.getValue().getGivenAnswers()));
        correct.setCellValueFactory(item -> new     SimpleIntegerProperty(item.getValue().getCorrectAnswers()));
    skipped.setCellValueFactory(item -> new     SimpleIntegerProperty(item.getValue().getSkippedAnswers()));
    }
}

关于如何解决此问题的任何想法?

使用JavaFX属性模式Vocable实现可变属性。 这允许表格单元格观察适当的属性,并在它们发生更改时做出响应。 对于不变的值,例如germanenglish ,您仍然可以使用常规(和最终)字段。 对于更改的值,但您想控制它们的更改方式(例如,您需要一个setGivenAnswers(int) increaseGivenAnswers()方法,但没有常规的setGivenAnswers(int)方法),则可以使用ReadOnlyXXXWrapper并公开ReadOnlyXXXProperty 因此,例如:

public class Vocable
{

    private final String german;
    private final String english;
    private final ReadOnlyIntegerWrapper givenAnswers = new ReadOnlyIntegerWrapper();
    private final ReadOnlyIntegerWrapper correctAnswers = new ReadOnlyIntegerWrapper();
    private final ReadOnlyIntegerWrapper skippedAnswers = new ReadOnlyIntegerWrapper();


    public Vocable(String ger, String eng)
    {
        german = ger;
        english = eng;
        givenAnswers.set(0);
        correctAnswers.set(0);
        skippedAnswers.set(0);
    }

    public String getGerman()
    {
        return german;
    }

    public String getEnglish()
    {
        return english;
    }

    public ReadOnlyIntegerProperty givenAnswersProperty() {
        return givenAnswers.getReadOnlyProperty() ;
    }

    public final int getGivenAnswers() 
    {
        return givenAnswersProperty().get();
    }

    public void increaseGivenAnswers() 
    {
        givenAnswers.set(getGivenAnswers()+1);
    }


    public ReadOnlyIntegerProperty correctAnswersProperty() {
        return correctAnswers.getReadOnlyProperty();
    }

    public final int getCorrectAnswers() 
    {
        return correctAnswersProperty().get();
    }

    public void increaseCorrectAnswers() 
    {
        this.correctAnswers.set(getCorrectAnswers()+1);
    }

    public ReadOnlyIntegerProperty skippedAnswersProperty() {
        return skippedAnswers.getReadOnlyProperty();
    }

    public final int getSkippedAnswers() 
    {
        return skippedAnswersProperty().get();
    }

    public void increaseSkippedAnswers() 
    {
        this.skippedAnswers.set(getSkippedAnswers()+1);
    }

}

为使单元格观察这些属性,请将单元格值工厂映射到已定义的属性:

german.setCellValueFactory(item -> new SimpleStringProperty(item.getValue().getGerman()));
english.setCellValueFactory(item -> new SimpleStringProperty(item.getValue().getEnglish()));

given.setCellValueFactory(item -> item.getValue().givenAnswersProperty());
correct.setCellValueFactory(item -> item.getValue().correctAnswersProperty());
skipped.setCellValueFactory(item -> item.getValue().skippedAnswersProperty());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM