powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFx2: блокировка UI
6 сообщений из 6, страница 1 из 1
JavaFx2: блокировка UI
    #38845447
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SWING я использовал JLayer + анимированный gif с колесиком.

Примерно такой код (кусок на scala):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
val layered = new JLayer[T](view, new LayerUI[T] {
        override def installUI(c: JComponent) {
            super.installUI(c)

            c.asInstanceOf[JLayer[_]].setLayerEventMask(
                AWTEvent.MOUSE_EVENT_MASK |
                    AWTEvent.MOUSE_MOTION_EVENT_MASK |
                    AWTEvent.KEY_EVENT_MASK)
        }

        override def uninstallUI(c: JComponent) {
            c.asInstanceOf[JLayer[_]].setLayerEventMask(0)

            super.uninstallUI(c)
        }

        override def eventDispatched(e: AWTEvent, l: JLayer[_ <: T]) {
            if (locked && e.isInstanceOf[InputEvent])
                e.asInstanceOf[InputEvent].consume()
        }
....



Чем заменить на JavaFx2? Что-то не нагуглил.
...
Рейтинг: 0 / 0
JavaFx2: блокировка UI
    #38845468
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дарю:

Индикатор прогресса кидаем на нужную форум
Код: xml
1.
2.
3.
4.
5.
<ProgressIndicator fx:id="progressIndicator" opacity="0.64" progress="-1.0">
      <StackPane.margin>
        <Insets bottom="100.0" left="100.0" right="100.0" top="100.0" />
      </StackPane.margin>
</ProgressIndicator>



Утилита для запуска фоновых задач с активизацией прогресса. Для JavaFX 8 диалог заменить на родной.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
public abstract class BackgroundTask<T> extends Task<T> {
    static Map<ProgressIndicator, AtomicInteger> indicatorMap = new HashMap<ProgressIndicator, AtomicInteger>();

    protected BackgroundTask(final ProgressIndicator indicator) {
        startIndicator(indicator);
        setOnFailed(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent workerStateEvent) {
                stopIndicator(indicator);
                Throwable exception = workerStateEvent.getSource().getException();
                exception.printStackTrace();
                final Dialog<DialogController> dialog = new Dialog<DialogController>("/fxml/DialogScenario.fxml", "#confirm");
                dialog.setTitle("Error!");
                dialog.getController().confirm.setText("OK");
                dialog.getController().message.setText(exception.getMessage());
                dialog.showAndWait();
            }
        });
        setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent workerStateEvent) {
                stopIndicator(indicator);
                process((T) workerStateEvent.getSource().getValue());
            }
        });

    }

    private static synchronized void startIndicator(ProgressIndicator indicator) {
        AtomicInteger count = indicatorMap.get(indicator);
        if(count == null){
            count = new AtomicInteger(0);
            indicatorMap.put(indicator, count);
        }
        count.incrementAndGet();
        indicator.setVisible(true);
    }

    private static synchronized void stopIndicator(ProgressIndicator indicator) {
        AtomicInteger count = indicatorMap.get(indicator);
        if(count == null){
            throw new IllegalStateException("Indicator wasn't started");
        }
        if(count.decrementAndGet() < 1){
            indicatorMap.remove(indicator);
            indicator.setVisible(false);
        }
    }

    protected abstract void process(T value);

    void execute(){
        new Thread(this).start();
    }
}



Использование:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        
new BackgroundTask<Collection<Feature>>(progressIndicator){
            @Override
            protected Collection<Feature> call() throws Exception {
                //Удаленный вызов в фоновом потоке.
                return server.reloadFeatures();
            }

            @Override
            protected void process(Collection<Feature> f) {
                //Обновляем UI по завершению вызова
                configuration.updateFeatures(f);
            }
}.execute();
...
Рейтинг: 0 / 0
JavaFx2: блокировка UI
    #38845472
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Я правильно понял, что это появится отдельный модальный диаложек с прогресс баром поверх моего окна?
Если так, то это не совсем то что было у меня в SWING.
...
Рейтинг: 0 / 0
JavaFx2: блокировка UI
    #38845483
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey KuznetsovЯ правильно понял, что это появится отдельный модальный диаложек с прогресс баром поверх моего окна?

Нет. Диалог здесь для отображения ошибки. ProgressIndicator через StackPane закрывает все остальные контролы. Тоже самое что у тебя было.
...
Рейтинг: 0 / 0
JavaFx2: блокировка UI
    #38845489
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlexey KuznetsovЯ правильно понял, что это появится отдельный модальный диаложек с прогресс баром поверх моего окна?

Нет. Диалог здесь для отображения ошибки. ProgressIndicator через StackPane закрывает все остальные контролы. Тоже самое что у тебя было.

А понял идею. Попробую StackPane заюзать. Единственно не совсем понятно, когда прогресс бар.setVisible(true) он мне закроет доступ к нижележащим контролам? Т.е. я не должен иметь возможность по ним мышкой кликать.
...
Рейтинг: 0 / 0
JavaFx2: блокировка UI
    #38845498
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey KuznetsovА понял идею. Попробую StackPane заюзать. Единственно не совсем понятно, когда прогресс бар.setVisible(true) он мне закроет доступ к нижележащим контролам? Т.е. я не должен иметь возможность по ним мышкой кликать.
Да, его нужно сверху поместить, чтобы закрыть ввод. Это доставляет неудобства при работе со SceneBuilder, поэтому надо подумать над вариантом как добавлять StackPane и ProgressIndicator динамически, а не через FXML.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFx2: блокировка UI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]