我创建了一个自定义表格单元格,该单元格通过该单元格上的选项菜单更改为编辑模式,并且在单击保存按钮之前不会更改为只读视图。现在,我将该进程包含在线程中,以将光标更改为等待,直到完成后才更改为正常。我的问题是在所有视图中光标都不会停留在等待模式,如果我将光标移动到处于编辑模式的任何单元格上方,则光标会变为写入模式,而不是停留在等待模式。 如果有人可以帮助我,请先谢谢。
btSave.setOnAction((event) -> {
final Task task = new Task<Void>() {
@Override
protected Void call() throws InterruptedException {
try {
root.setCursor(Cursor.WAIT);
Set<Node> cells = table.lookupAll(".table-cell");
for (Node node : cells) {
TableCell<?, ?> cell = (TableCell<?, ?>) node;
if (cell.getGraphic() instanceof TextField) {
cell.getGraphic().setCursor(Cursor.WAIT);
}
}
int first = GuiUtil.getIndexToScroll(tvKontiMonths);
DataBean dataBean = new DataBean(table.getItems(),
results.isLevel());
Map<String, Boolean> listUpdates = (Map<String, Boolean>) DataProvider.getInstance()
.updateData(dataBean);
table.setCursor(Cursor.DEFAULT);
root.setCursor(Cursor.DEFAULT);
resetEditProperties();
refreshWithManualCells(listUpdates);
tvKontiMonths.scrollTo(first);
tvKonti.scrollTo(first);
} catch (Exception e) {
}
return null;
}
};
new Thread(task).start();
});
答案 0 :(得分:0)
我不确定您如何设置光标,但是如果您想将光标设置为整个场景的“等待”状态,我会做类似node.getScene().setCursor(Cursor.WAIT);
的操作,这是因为它将设置该光标对于所有子节点,因此,如果您只希望将光标用作表,则可以设置table.setCursor(Cursor.WAIT);
编辑:试一试,您只需要在场景上进行设置,子节点也应该具有该属性,因此我注释掉了其他节点的设置
btSave.setOnAction((event) -> {
final Task task = new Task<Void>() {
@Override
protected Void call() throws InterruptedException {
try {
//root.setCursor(Cursor.WAIT);
//Set<Node> cells = table.lookupAll(".table-cell");
//for (Node node : cells) {
// TableCell<?, ?> cell = (TableCell<?, ?>) node;
// if (cell.getGraphic() instanceof TextField) {
// cell.getGraphic().setCursor(Cursor.WAIT);
// }
//}
btSave.getScene().setCursor(Cursor.WAIT);
int first = GuiUtil.getIndexToScroll(tvKontiMonths);
DataBean dataBean = new DataBean(table.getItems(),
results.isLevel());
Map<String, Boolean> listUpdates = (Map<String, Boolean>) DataProvider.getInstance()
.updateData(dataBean);
//table.setCursor(Cursor.DEFAULT);
//root.setCursor(Cursor.DEFAULT);
btSave.getScene().setCursor(Cursor.DEFAULT);
resetEditProperties();
refreshWithManualCells(listUpdates);
tvKontiMonths.scrollTo(first);
tvKonti.scrollTo(first);
} catch (Exception e) {
}
return null;
}
};
new Thread(task).start();
});
这也是一个可运行的示例:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Button button = new Button("Wait Cursor");
button.setOnAction(event ->
new Thread(()->{//Imitating your threading
//Show that stuff is being processed
button.getScene().setCursor(Cursor.WAIT);
//process some stuff
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//finished processing change cursor back
button.getScene().setCursor(Cursor.DEFAULT);
}).start()
);
VBox vBox = new VBox();
vBox.getChildren().add(button);
//It looked empty so I added labels lol
for(int i =0; i<10;i++)
vBox.getChildren().add(new Label("Fake Node Number " + i));
Stage stage = new Stage();
stage.setScene(new Scene(vBox));
stage.show();
}
public static void main(String[] args) { launch(args); }
}