Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JavaFX. Как сменить курсор в кнопке с длительным событием? / 19 сообщений из 19, страница 1 из 1
21.10.2016, 11:24
    #39331337
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
Решил попробовать новые технологии в демке 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
21.10.2016, 11:31
    #39331347
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
21.10.2016, 11:35
    #39331355
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczinitData() нужно вынести в фоновый поток
увижу про хвалебные речи JavaFX - дам. Где то читал.
Я сравниваю с Delphi. Там первая строка отработает всё равно.
А тут, как будто всё что внутри выносится в отдельный поток и на выходе синхронизируется с потоком ГУИ.
Неудобно.
...
Рейтинг: 0 / 0
21.10.2016, 11:37
    #39331360
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczinitData() нужно вынести в фоновый поток
вот это я не пойму.
По уму и смыслу, мне надо ждать коннект. И не надо выносить ни в какой поток.
Всё работает!
Но из за строки курсора - выносить? Изврат.
...
Рейтинг: 0 / 0
21.10.2016, 11:38
    #39331362
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
Blazkowicz,
счас пробую в потоках
...
Рейтинг: 0 / 0
21.10.2016, 11:48
    #39331378
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
Petro123Я сравниваю с Delphi. Там первая строка отработает всё равно.

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

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

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

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

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


Но всё по прежнему(.
...
Рейтинг: 0 / 0
21.10.2016, 11:53
    #39331384
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczЕсть мануал по теме?
там события контролов платформа делает в основном потоке.
AFAIK))
BlazkowiczЕсли ты в этом потоке занимаешься чем-то долгим, то весь GUI не работает, потому как потока нет,
Я понимаю. Просто курсор операционки . И он меняется....очередь наверно другая.
...
Рейтинг: 0 / 0
21.10.2016, 11:58
    #39331400
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
21.10.2016, 12:02
    #39331405
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
21.10.2016, 12:03
    #39331408
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczЯ обычно горожу какое-то простое решение, которое само запускает прогресс бар вообще для любой потенциально долгой задачи (любая работа с сервером, будь то БД или HTTP)
вот, сижу и думаю. У меня коннект и заполнение таблички хрен занет сколько будет.
Т.е. нужен прогрессбар бесконечный)) или курсор часики.
Нда.....................
...
Рейтинг: 0 / 0
21.10.2016, 12:05
    #39331409
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczТак как в JFX гуя таки не блокируется, значит что-то они там хитрое таки намутили для этого.
ОК
Спасибо!
За 5 минут сменить курсор не получилось))))
Будет время буду копать.
Спасибо!
...
Рейтинг: 0 / 0
21.10.2016, 14:27
    #39331578
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
ещё интересная особенность платформы:
- почему исключительная ситуация не выходит на самый верх в виде какого нибудь окошка?
Например на это:
Код: java
1.
		throw new ConnectException("Error! DB Connect Error!");


полное молчание. Окно с ошибкой только самому?
В Delphi выйдет неказистое окно ошибки от платформы.
Решение минимум это поставить руками хотя бы один обработчик Application? Так вроде.
...
Рейтинг: 0 / 0
21.10.2016, 14:37
    #39331593
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
21.10.2016, 14:52
    #39331624
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
BlazkowiczТак как вся гуя на одном потоке, то вешается handler на сам поток
вот я и подумал, что они уже тут всё что можно отвязали от основного.
Т.к. райзе в коде никак не выходят на экран.
Это же не сервер с логами, а десктоп.
Опупеть. Стока кода писать надо для утилиты админу)).
Где то тут был код с хуком на Main() чтобы ловить все исключалки.
...
Рейтинг: 0 / 0
21.10.2016, 15:09
    #39331648
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
21.10.2016, 16:36
    #39331772
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
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
23.10.2016, 10:26
    #39332254
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
по первому вопросу выход найден.
Курсор тоже делается через биндинг. Хотя конечно неудобно.
Повторюсь, что если сравнивать с 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
23.10.2016, 10:33
    #39332255
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JavaFX. Как сменить курсор в кнопке с длительным событием?
по поводу построения визуального ГУИ.
Замечательная штука для мышкоклепания формочек, но ложка дёгтя в том что она не связана с самим файлом Контроллер.java как в Delphi напр.
Т.е. нет автомата при двойном клике на событии MouseClick в построителе и автоматом создании строчки кода
Код: java
1.
2.
@FXML
	private void handleBtnTempAction(ActionEvent event)


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


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