powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX. Как сменить курсор в кнопке с длительным событием?
19 сообщений из 19, страница 1 из 1
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331337
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил попробовать новые технологии в демке JavaFX v8.
Старался писать минимум кода.
- Всё работает, но смена курсора в 1 строке реально его меняет только на выходе из функции. А нужно сразу после клика.
- В каком потоке, дополнительном или потоке ГУИ работает код в функции? Как немедленно в потоке ГУИ вызвать строку смены курсора?
- Читал что в JavaFX УЖЕ всё сделано для асинхронной работы. Т.е. для асинхронности уже не нужно самому делать потоки. Верно или нет?
Здесь особенность, что мне нужна безпоточная синхронность. Сначала курсор, потом ждём коннект 15 сек.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	@FXML
	private void handleBtnTempAction(ActionEvent event) throws ConnectException {
		primaryStage.getScene().getRoot().setCursor(Cursor.HAND);
		//primaryStage.getScene().setCursor(Cursor.HAND);
		// btnTemp.setCursor(Cursor.HAND);

		try {
			initData(); // 15 сек.
		} catch (ConnectException e) {
			e.printStackTrace();
		}

	}


Спс.
______________________________________________
"Сложнее всего в мире достигнуть простоты — это крайняя граница опыта и последнее усилие гения". © George Sand.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331347
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123- Читал что в JavaFX УЖЕ всё сделано для асинхронной работы. Т.е. для асинхронности уже не нужно самому делать потоки. Верно или нет?

Ссылку. Я такого не видел. От Swing мало чем отличается в этом плане. Точно так же нельзя блокировать EDT.
initData() нужно вынести в фоновый поток
Туториал
https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm
Набор полезных классов
https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/package-summary.html
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331355
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczinitData() нужно вынести в фоновый поток
увижу про хвалебные речи JavaFX - дам. Где то читал.
Я сравниваю с Delphi. Там первая строка отработает всё равно.
А тут, как будто всё что внутри выносится в отдельный поток и на выходе синхронизируется с потоком ГУИ.
Неудобно.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331360
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczinitData() нужно вынести в фоновый поток
вот это я не пойму.
По уму и смыслу, мне надо ждать коннект. И не надо выносить ни в какой поток.
Всё работает!
Но из за строки курсора - выносить? Изврат.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331362
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
счас пробую в потоках
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331378
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Я сравниваю с Delphi. Там первая строка отработает всё равно.

Есть мануал по теме?

Petro123А тут, как будто всё что внутри выносится в отдельный поток и на выходе синхронизируется с потоком ГУИ.

То есть ты и в Swing никогда не сталкивался? Суть в том что весь GUI работает в одном единственном потоке. Если ты в этом потоке занимаешься чем-то долгим, то весь GUI не работает, потому как потока нет, который бы что-то перерисовывал или события обрабатывал.

Поэтому любые задачи длительностью больше долей секунды надо выполнять в фоновом потоке, а результат синхронизировать с EDT для правильного вывода в GUI. Разница между Swing и JavaFX только в том что в Swing пришлось ждать SwingWorker долгие годы. А в JavaFX уже куча полезных классов, чтобы просто и безболезенно отделить рабочий код от GUI/EDT.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331380
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
теоретически, обёртка строки вот в это должна заставить выполнить код смены курсора в потоке ГУИ.
Поток ведь пока не занят?

Код: java
1.
2.
3.
4.
5.
6.
		Platform.runLater(new Runnable() {
		    @Override
		    public void run() {
				primaryStage.getScene().setCursor(Cursor.WAIT);
		    }
		});


Но всё по прежнему(.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331384
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсть мануал по теме?
там события контролов платформа делает в основном потоке.
AFAIK))
BlazkowiczЕсли ты в этом потоке занимаешься чем-то долгим, то весь GUI не работает, потому как потока нет,
Я понимаю. Просто курсор операционки . И он меняется....очередь наверно другая.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331400
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123теоретически, обёртка строки вот в это должна заставить выполнить код смены курсора в потоке ГУИ.
Поток ведь пока не занят?

Нет. В SwingUtils был другой метод. invokeAndWait. Из JavaFX аналогичный убрали. С ним бы прокатило.
А runLater() ставит обновление в очередь, а поток GUI всё так же занят ожиданием соединения.

Вообще для больших проектов лучше автоматизировать такие штуки
Вот для Swing интересные решения
http://www.javaspecialists.eu/archive/Issue075.html
http://www.javaspecialists.eu/archive/Issue104.html
Но чтобы их правильно перевести в JavaFX, нужно понять как оно работает. Так как в JFX гуя таки не блокируется, значит что-то они там хитрое таки намутили для этого.

Я обычно горожу какое-то простое решение, которое само запускает прогресс бар вообще для любой потенциально долгой задачи (любая работа с сервером, будь то БД или HTTP)
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331405
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
вот код типичный на Delphi.
Там везде один поток и это правильно.
Где нужно делается асинхронность.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TAdditTaskForm.FormCreate(Sender: TObject);
var
   OldCursor: TCursor;
begin
     OldCursor:=Screen.Cursor;
     Screen.Cursor:=crSQLWait;
       AdditWorksDBGrid.Font:=FMain.fdGridCont.Font;
       AdditWorksDBGrid.TitleFont:=FMain.fdTitleFont.Font;
       LoadUserInt;
     Screen.Cursor:=OldCursor;
end;


Код выполняется построчно по БЛ.
Тут у меня счас асинхронные микросервисы будут? )))))
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331408
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ обычно горожу какое-то простое решение, которое само запускает прогресс бар вообще для любой потенциально долгой задачи (любая работа с сервером, будь то БД или HTTP)
вот, сижу и думаю. У меня коннект и заполнение таблички хрен занет сколько будет.
Т.е. нужен прогрессбар бесконечный)) или курсор часики.
Нда.....................
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331409
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТак как в JFX гуя таки не блокируется, значит что-то они там хитрое таки намутили для этого.
ОК
Спасибо!
За 5 минут сменить курсор не получилось))))
Будет время буду копать.
Спасибо!
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331578
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё интересная особенность платформы:
- почему исключительная ситуация не выходит на самый верх в виде какого нибудь окошка?
Например на это:
Код: java
1.
		throw new ConnectException("Error! DB Connect Error!");


полное молчание. Окно с ошибкой только самому?
В Delphi выйдет неказистое окно ошибки от платформы.
Решение минимум это поставить руками хотя бы один обработчик Application? Так вроде.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331593
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Так как вся гуя на одном потоке, то вешается handler на сам поток
http://stackoverflow.com/questions/23612854/javafx-8-lombard-global-exception-handling
Но вопрос ещё не закрыт, какие-то тёрки по поводу текущей реализации продолжаются
https://bugs.openjdk.java.net/browse/JDK-8088773

По поводу прогресс бара, есть два хороших варианта. Если мы не хотим лочить UI, то это заводим постоянный прогресс в statusbar и все фоновые задачи завязываем на него.
Если хочется залочить UI, то можно это сделать через модальный диалог. А можно через прозрачную панель и круговой ProgressIndicator. Таким образом можно, например, лочить часть UI, в отличие от диалога.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331624
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТак как вся гуя на одном потоке, то вешается handler на сам поток
вот я и подумал, что они уже тут всё что можно отвязали от основного.
Т.к. райзе в коде никак не выходят на экран.
Это же не сервер с логами, а десктоп.
Опупеть. Стока кода писать надо для утилиты админу)).
Где то тут был код с хуком на Main() чтобы ловить все исключалки.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331648
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK
помониторил тему насчёт перехвата всех ошибок для своего рками alert!
Код: java
1.
2.
Alert alert = new Alert(AlertType.ERROR, "!!!!!!!!!!");
			alert.showAndWait();


Оказалось что это тоже не просто))
авторAs of JavaFX 8, Thread.setDefaultUncaughtExceptionHandler(...) should work: see RT-15332.

Things are a little complicated if an uncaught exception occurs during execution of the start(...) method. Depending on how the application is launched, the code that invokes start() (e.g. the implementation of Application.launch(...)) may catch the exception and handle it, which would obviously prevent the default exception handler from being invoked.
http://stackoverflow.com/questions/26361559/general-exception-handling-in-javafx-8
а должно быть в десктопе по умолчанию.
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39331772
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТак как вся гуя на одном потоке, то вешается handler на сам поток
http://stackoverflow.com/questions/23612854/javafx-8-lombard-global-exception-handling
Но вопрос ещё не закрыт, какие-то тёрки по поводу текущей реализации продолжаются
https://bugs.openjdk.java.net/browse/JDK-8088773
спасибо!
Вот так есть перехват:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	@Override
	public void start(Stage primaryStage) {
		this.primaryStage = primaryStage;
	    this.primaryStage.setTitle(MAINFORM_CAPTION);

	    Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> {
            System.out.println("Handler caught exception: "+throwable.getMessage());
			Alert alert = new Alert(AlertType.ERROR, "Ошибка!");
			alert.showAndWait();
       });
	    initShowRootLayout();
	}
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39332254
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по первому вопросу выход найден.
Курсор тоже делается через биндинг. Хотя конечно неудобно.
Повторюсь, что если сравнивать с Delphi, то основной метод прикладного кода - синхронный без потоков.
И в Delphi курсор успевает сменится на часики вероятно из за того что он не в Scene, а в операционке.
Тогда курсор меняется и пользователь просто ожидает минуту-две все запросы к БД.
...
В JavaFX это не работает и непонятно когда работает Платформа.runLater, и есть ли что либо для немедленно запуска строчки кода в основном потоке (синхронная работа).
...
На данный момент чтобы работала смена курсора я обязан любой кусок кода оборачивать в поток и возвращение курсора ловить по окончании потока. Либо биндинг С ПОТОКАМИ вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Main extends Application {
	final ObjectProperty<Cursor> CURSOR_DEFAULT = new SimpleObjectProperty<>(Cursor.DEFAULT);
	final ObjectProperty<Cursor> CURSOR_WAIT = new SimpleObjectProperty<>(Cursor.WAIT);
..
		 final Task<Void> task = new Task<Void>() {
..
	        };
	        scene.cursorProperty().bind(Bindings.when(task.runningProperty())
	                .then(CURSOR_WAIT).otherwise(CURSOR_DEFAULT));
	        new Thread(task).start();
...
Рейтинг: 0 / 0
JavaFX. Как сменить курсор в кнопке с длительным событием?
    #39332255
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу построения визуального ГУИ.
Замечательная штука для мышкоклепания формочек, но ложка дёгтя в том что она не связана с самим файлом Контроллер.java как в Delphi напр.
Т.е. нет автомата при двойном клике на событии MouseClick в построителе и автоматом создании строчки кода
Код: java
1.
2.
@FXML
	private void handleBtnTempAction(ActionEvent event)


Нужно каждый раз делать:
- меню Сохранить
- Кнопка о запросе в фокусе, но на Enter не реагирует))
- Иклипсе - обновить (тот файл с диска).
....кошмар))
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX. Как сменить курсор в кнопке с длительным событием?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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