JavaFX: новое мЫшленье в вопросах обработки событий
Осваиваю JavaFX, которая, между прочим, весьма динамично развивается (даже не заметил, как вышла версия 2.1). По сравнению со Swing и AWT изменено очень многое. Что-то в сторону упрощения и удобства, но кое-что очень непривычно и поначалу вызывает раздражение. Однако стоит понять общую идею, как приходишь к мысли: «А ведь иначе и быть не должно!» Например, важно понять что такое связывание (binding). В прежних версиях GUI от Java принято было, как и в других средах создания визуальных компонентов, идти именно от видимого: щелкнул курсором по текстовому полю — сработало событие FocusGained или FocusLost, которое очевиднейшим образом обрабатываешь, т.е. меняешь состояние полей, вызываешь методы. Разработчики JavaFX рекомендуют идти от обратного: изменилось состояние некого абстрактного объекта (строки, числа, и т.п.) — происходят изменения в пользовательском интерфейсе. Так что FocusListener или FocusHandler, например, искать в JavaFX бесполезно. Вместо этого делается так:
Т.е. некое свойство GUI-элемента — focusedProperty — изменяется и это влечет за собой события. Как производятся сами изменения — это уж забота системы. Программист же должен сосредоточиться на реакции.
Потихоньку вхожу во вкус такого программирования, которое, хотя и непривычно, но и впрямь очень способствует сосредоточению на бизнес-логике, а не рисовании красивых интерфейсов. Впрочем, интерфейсы и без того получаются довольно симпатичные.
package ru.yababay;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
/**
*
* @author yababay
*/
public class Sample implements Initializable {
@FXML
private TextField label;
@Override
public void initialize(URL url, ResourceBundle rb) {
label.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if(!newValue.booleanValue())
System.out.println(label.getText());
}
} );
}
}
Т.е. некое свойство GUI-элемента — focusedProperty — изменяется и это влечет за собой события. Как производятся сами изменения — это уж забота системы. Программист же должен сосредоточиться на реакции.
Потихоньку вхожу во вкус такого программирования, которое, хотя и непривычно, но и впрямь очень способствует сосредоточению на бизнес-логике, а не рисовании красивых интерфейсов. Впрочем, интерфейсы и без того получаются довольно симпатичные.
- —
- 18 апреля 2012, 22:58
Комментарии (0)
RSS свернуть / развернутьТолько зарегистрированные и авторизованные пользователи могут оставлять комментарии.