Система событий, о которой я расскажу здесь, основана на механизме обработки событий, используемом в библиотеке Buoy Swing ( http://buoy.sourceforge.net ). Это отличная библиотека для разработки приложений Swing. Я изменил код обработки событий библиотеки буя, чтобы обеспечить поддержку обобщенных элементов и интеграцию калитки.
В Java нет механизма, соответствующего событиям и делегатам в C #. Вместо них мы должны использовать интерфейсы и анонимные классы, чтобы получать информацию о событиях компонентов; однако это приводит к увеличению количества классов и затрудняет чтение исходного кода. Эта новая система событий упрощает обработку событий, что подразумевает четкое разделение между компонентами и их клиентами.
Я разработаю страницу входа в качестве примера, чтобы объяснить концепцию. Эта страница содержит многократно используемый компонент под названием «LoginComponent». Задача этого компонента — проверить, правильно ли пользователь вводит правильное имя пользователя и пароль. После проверки пользовательского ввода повторно используемый компонент будет отправлять события, указывающие состояние входа в систему. Если пользователь входит в систему успешно, поле «успех» события устанавливается на «истина», в противном случае оно устанавливается на «ложь». «LoginPage», включая «LoginComponent», получает события входа и действует соответственно. Если войти не удается, отображается сообщение об ошибке; в противном случае он перенаправляет пользователя на другую страницу.
Я перечисляю код ниже.
LoginPage.html
<html><head>
<title> Login page </title>
</head>
<body>
<table>
<tr>
<td>
<div wicket:id="feedbackPanel">
</div>
</td>
</tr>
<tr>
<td>
<div wicket:id="loginPanel">
</div>
</td>
</tr>
</table>
</body>
</html>
LoginPage.java
public class LoginPage extends EasyPage {
public LoginPage() {
add(new FeedbackPanel("feedbackPanel"));
LoginComponent loginComponent = new LoginComponent("loginPanel");
add(loginComponent);
loginComponent.addEventLink(LoginEvent.class, this, "onLogin");
}
@SuppressWarnings("unused")
private void onLogin(LoginEvent event) {
if ( event.isSuccess() ) {
// redirect to another page
info("Login successful");
}else {
error("Login failed");
}
}
}
Список кодов для «LoginComponent» ниже;
LoginComponent.html
<wicket:panel>
<form wicket:id="form">
<table>
<tr>
<td> User name </td>
<td> <input type="text" wicket:id="txtUsername"> </td>
</tr>
<tr>
<td> Password </td>
<td> <input type="password"" wicket:id="txtPassword"> </td>
</tr>
<tr>
<td> </td>
<td> <button type="submit" wicket:id="btnLogin"> Login </button> </td>
</tr>
</table>
</form>
</wicket:panel>
LoginComponent.java
public class LoginComponent extends EasyPanel {
@EasyWicket(id="form")
Form<Void> form;
@EasyWicket(id="form.txtUsername", value="username", required=true)
TextField<String>txtUsername;
@EasyWicket(id="form.txtPassword", value="password", required=true)
PasswordTextField txtPassword;
@EasyWicket(id="form.btnLogin", action="actionLogin")
Button btnLogin;
String username, password;
private static Logger logger = LoggerFactory.getLogger(LoginComponent.class);
public LoginComponent(String id) {
super(id);
}
public void actionLogin() {
if ( logger.isInfoEnabled() ) {
logger.info("username=" + username + " password=" + password);
}
LoginEvent event = new LoginEvent(this);
event.setSuccess(System.currentTimeMillis() % 2 == 0);
dispatchEvent(event);
}
}
Наконец, исходный код «LoginEvent»
LoginEvent.java
public class LoginEvent extends WicketEvent {
private boolean success;
public LoginEvent(Component source) {
super(source);
}
public void setSuccess(boolean success) {
this.success = success;
}
public boolean isSuccess() {
return success;
}
}
Для получения событий прослушиватель событий должен быть зарегистрирован как «LoginPage.java»
loginComponent.addEventLink(LoginEvent.class, this, "onLogin");
Этот фрагмент кода говорит: «this» зарегистрирован как слушатель «LoginEvent», и метод «onLogin» должен быть вызван при запуске «LoginEvent».
Для поддержки этого типа поведения «LoginComponent» должен использовать диспетчер событий, как показано в следующем коде:
из JavaComponent.java
LoginEvent event = new LoginEvent(this);
event.setSuccess(System.currentTimeMillis() % 2 == 0);
dispatchEvent(event);
Этот код создает событие входа в систему, устанавливает поле «success» в соответствии с результатом входа в систему и отправляет событие слушателям события.
Как видно из исходного кода, элементы пользовательского интерфейса снабжены аннотацией «@EasyWicket». Эта аннотация взята из библиотеки EasyWicket, о которой я говорил в предыдущей статье . Я также включил код обработки событий в библиотеку EasyWicket . Вы можете получить коды здесь .