【发布时间】:2017-07-22 06:39:57
【问题描述】:
我正在使用 JavaFX 为我的妻子编写一个小词汇训练器。 每个单词都存储它自己的统计值,例如她遇到该单词的频率以及她提供正确答案的频率。 我已经为此设置了一个 TableView,但是在培训课程之后,统计数据不会更新。单词对象本身具有正确的值,但它们只是没有显示在 TableView 中。 由于 ObservableList 的性质,通常 TableView 总是显示对象的当前值,对吧?但在这种情况下不是。
这是我的词类:
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++;
}
}
这是我的视图类:
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 property pattern 实现
Vocable以自动更新值。然后将单元格值工厂映射到存储在Vocable实例中的属性对象。 -
哦,当然!多么愚蠢……非常感谢!
标签: java javafx tableview observable