[英]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
实现可变属性。 这允许表格单元格观察适当的属性,并在它们发生更改时做出响应。 对于不变的值,例如german
和english
,您仍然可以使用常规(和最终)字段。 对于更改的值,但您想控制它们的更改方式(例如,您需要一个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.