提问人:cworner1 提问时间:8/9/2023 最后编辑:0009laHcworner1 更新时间:8/10/2023 访问量:46
将侦听器和文本格式添加到 TableRow [closed]
Add both listeners and text formatting to TableRow [closed]
问:
我有一个扩展的类。具有以下代码中的拖放功能:JobTable
TableView
TableView
setRowFactory(tv -> {
TableRow<Job> row = new TableRow<>();
row.setOnDragDetected(event -> {
if (!row.isEmpty()) {
Dragboard db = row.startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString(Integer.toString(row.getIndex()));
db.setContent(content);
}
event.consume();
});
row.setOnDragOver(event -> {
Dragboard db = event.getDragboard();
if (db.hasString()) {
int draggedIndex = Integer.parseInt(db.getString());
if (draggedIndex != row.getIndex())
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
row.setOnDragDropped(event -> {
Dragboard db = event.getDragboard();
if (db.hasString()) {
int draggedIndex = Integer.parseInt(db.getString());
Job draggedItem = getItems().get(draggedIndex);
int dropIndex = (row.isEmpty()) ? this.getItems().size() : row.getIndex();
reIndexJobs(draggedIndex + 1, dropIndex + 1, draggedItem.getCategoryProperty().getValue());
event.setDropCompleted(true);
refreshDataModel();
getSelectionModel().select(dropIndex);
}
event.consume();
});
return row;
});
代码工作正常。后来我想添加一些格式,所以我后来写了以下代码:
setRowFactory(tv -> new TableRow<Job>() {
@Override
protected void updateItem(Job job, boolean empty) {
super.updateItem(job, empty);
System.out.println("Checkpoint");
if (job == null)
setStyle("");
else if (job.isOnHold())
setStyle("-fx-background-color: #baffba;");
else
setStyle("");
}
});
这也正常工作。但是,目前我只能选择其中之一。我试图通过扩展在以下声明中声明的内部类来组合这两个功能:setRowFactory
TableRow
JobTable
public class CustomTableRow extends TableRow<Job> {
public CustomTableRow() {
super();
setOnDragDetected(event -> {
if (!isEmpty()) {
Dragboard db = startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString(Integer.toString(getIndex()));
db.setContent(content);
}
event.consume();
});
setOnDragOver(event -> {
Dragboard db = event.getDragboard();
if (db.hasString()) {
int draggedIndex = Integer.parseInt(db.getString());
if (draggedIndex != getIndex())
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
setOnDragDropped(event -> {
Dragboard db = event.getDragboard();
if (db.hasString()) {
int draggedIndex = Integer.parseInt(db.getString());
Job draggedItem = getItems().get(draggedIndex);
int dropIndex = (isEmpty()) ? getItems().size() : getIndex();
reIndexJobs(draggedIndex + 1, dropIndex + 1,
draggedItem.getCategoryProperty().getValue());
event.setDropCompleted(true);
refreshDataModel();
getSelectionModel().select(dropIndex);
}
event.consume();
});
}
@Override
protected void updateItem(Job job, boolean empty) {
super.updateItem(job, empty);
if (job == null)
setStyle("");
else if (job.isOnHold())
setStyle("-fx-background-color: #baffba;");
else
setStyle("");
}
}
然后将行工厂设置为新类:CustomTableRow
setRowFactory(tv -> new CustomTableRow());
格式有效,但我失去了拖放功能。我对函数式编程相当陌生,所以我有点挣扎......
答: 暂无答案
评论
row.itemProperty().map(Job::onHoldProperty).orElse(false).addListener((obs, wasOnHold, isOnHold) -> row.setStyle(isOnHold ? "-fx-background-color: #baffba;" : ""));
TableRow