我从tableView获取行。我使用setRowFactory来获取行,后来我正在使用它。
我需要覆盖updateItem方法来获取每一行,如果该行内的项有错误,则使用红色,否则使用绿色。
该行内的项目是"历史"对象,因为行是历史记录 - 历史记录,它是在应用程序中执行某些操作后创建的。
所以我有这样的事情:
@Override
protected void updateItem(History history, boolean empty) {
super.updateItem(history, empty);
if (empty) {
setStyle("");
} else if (history.isHasError() == true) {
getStyleClass().clear();
getStyleClass().add("errorHistoryRow");
} else if (history.isHasError() == false){
getStyleClass().clear();
getStyleClass().add("");
}
}
但我需要将此updateItem添加到此方法中已定义的行。
private void openErrorMessageAfterHoveringOverRow() {
historyTableView.setRowFactory(tableView -> {
final TableRow<History> row = new TableRow<>();
for (History history : model.getAllHistoryObservableArrayList()) {
***I NEED TO PUT IT HERE***
}
for (History his : model.getAllHistoryObservableArrayList()) {
row.hoverProperty().addListener((observable) -> {
History historyRow = row.getItem();
Point p = MouseInfo.getPointerInfo().getLocation();
int x = p.x;
int y = p.y;
Popup popup = new Popup();
popup.setX(x - 300);
popup.setY(y - 200);
TextArea ta = new TextArea();
AnchorPane layout = new AnchorPane();
Scene scene = new Scene(layout);
stageSingleton().setScene(scene);
if (row.isHover() && his.equals(historyRow)) {
ta.setText(row.getItem().getErrorMessage());
popup.getContent().addAll(ta);
stageSingleton().show();
popup.show(stageSingleton());
} else if (!row.isHover() && his.equals(historyRow)) {
popup.hide();
stageSingleton().close();
}
});
}
return row;
});
}
那么,我怎样才能将方法updateItem实现为此方法中已定义的行?因为下面的方法有效但我不能有2个不同的&#34; setRowFactory&#34;我项目中的方法。所以我需要在一种方法中合并它们。
public void test() {
historyTableView.setRowFactory(tableView -> new TableRow<History>() {
@Override
protected void updateItem(History history, boolean empty) {
super.updateItem(history, empty);
if (empty) {
setStyle("");
} else if (history.isHasError() == true) {
getStyleClass().clear();
getStyleClass().add("errorHistoryRow");
} else if (history.isHasError() == false){
getStyleClass().clear();
getStyleClass().add("");
}
}
});
}
答案 0 :(得分:1)
不可能使用不同的rowFactory
s(至少你不能删除已经创建的行)。您需要合并rowFactory
返回的行中的功能。
一些补充说明:
table-row-cell
样式类)。在这种情况下,使用伪类更容易。此外,将空字符串添加为样式类对任何方式都没有好处。InvalidationListener
用于hover
媒体资源。每当值发生变化时,如果它从true
变为false
或反过来,则会触发此类侦听器。 public class HistoryRow extends TableRow<History> {
private static final PseudoClass ERROR = PseudoClass.getPseudoClass("error");
public HistoryRow() {
hoverProperty().addListener((o, oldValue, newValue) -> {
if (newValue) {
History historyRow = getItem();
if (historyRow != null && historyRow.isHasError()) {
// TODO: display popup here
}
}
});
}
@Override
protected void updateItem(History history, boolean empty) {
super.updateItem(history, empty);
pseudoClassStateChanged(ERROR, !empty && history != null && history.isHasError());
}
}
在CSS样式表中,从样式类更改为伪类需要您调整选择器。您需要使用:error
伪类选择器而不是.errorHistoryRow
类选择器。
通过向BooleanProperty
添加History
并在updateItem
方法中添加/删除侦听器,可以动态地从错误的历史记录元素更改为非错误的方法,反之亦然如果有必要的话。