Javafx tablecell меняет курсор в режиме редактирования - PullRequest
0 голосов
/ 30 января 2019

Я создал пользовательскую табличную ячейку, которая переключается в режим редактирования, щелкая меню параметров над этой ячейкой, и не переключается в режим только для чтения, пока не будет нажата кнопка «Сохранить».Теперь я включил этот процесс в поток, чтобы изменить курсор на ожидание, а не на нормальный, пока он не закончится.Моя проблема в том, что курсор не остается в режиме ожидания на всех экранах, если я перемещаю курсор на любую ячейку в режиме редактирования, курсор переходит в режим записи вместо того, чтобы оставаться в ожидании.Если кто-нибудь может мне помочь, заранее спасибо.

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 голосов
/ 30 января 2019

Я не совсем уверен, как вы устанавливаете курсор, но если вы хотите, чтобы курсор "ожидал" всю сцену, я бы сделал что-то вроде 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); }
}
...