Javafx tablecell更改游标在编辑模式下等待

时间:2019-01-30 07:50:26

标签: javafx cursor tableview wait tablecell

我创建了一个自定义表格单元格,该单元格通过该单元格上的选项菜单更改为编辑模式,并且在单击保存按钮之前不会更改为只读视图。现在,我将该进程包含在线程中,以将光标更改为等待,直到完成后才更改为正常。我的问题是在所有视图中光标都不会停留在等待模式,如果我将光标移动到处于编辑模式的任何单元格上方,则光标会变为写入模式,而不是停留在等待模式。 如果有人可以帮助我,请先谢谢。

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();
      });

1 个答案:

答案 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); }
}