![](/img/trans.png)
[英]How to use PropertyChangeSupport and PropertyChangeListener?
[英]Is it a good way to use PropertyChangeListener interface?
我懷疑與fireIndexedPropertyChange()方法的深層含義和用法有關,它觸發了一個事件,該事件將被我在另一個類中聲明的propertyChange()偵聽器攔截和處理。
例如,在使用JButton實現登錄GUI(顯示登錄表單)的類中,我有這個方法,當用戶clik on my button時執行:
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Button cliccked");
Main listener = new Main(); // I intantiate a new Main object to have the PropertyChangeListener
this.addPropertyChangeListener(listener); // I add the PropertyChange Listener to this LoginFrame object
/* I fire a PropertyChange: the event start and will be handled by the propper propertyChange() method definied in the
* listener class:
*
* @param "loginButtonClicked"
* */
firePropertyChange("loginResult", false, loginResult);
}
因此,當尚未登錄的用戶單擊我的按鈕時,將執行此方法並觸發新的PropertyChange事件。
我的PropertyChange事件帶有以下信息:
propertyName是可以更改的屬性的名稱(在我的示例中名為loginResult,因為我有一個名為loginResult的布爾變量,如果用戶可以在clikc按鈕時登錄,則值為true,否則為false
舊值是可以更改的屬性的舊值(在我的示例中為false,因為如果用戶看到登錄窗口,則表示它未登錄且loginResul = false
新值 :在這種情況下,它是loginResult變量的內容(如果用戶正在登錄系統, 則為 true)
因此,我的propertyChange()方法(在偵聽器類中聲明)將根據這些參數攔截此PropertyChange事件:例如,以下列方式:
**如果propertyName是loginResult並且新值為true,則不再顯示登錄窗口但顯示主應用程序窗口**
這是我的推理正確,它可能是一個使用PropertyChangeListener接口的好方法?
TNX
安德里亞
你可以這樣使用它,它會工作。 但我認為你的問題更多的是關於語義,而不僅僅是它是否有效。 該接口的包是java.beans
,它將它放在bean的上下文中。 如果您在bean上下文中使用它,即您的事件發布者是bean,那么我認為接口的“深層含義”與您的使用一致。 javadoc說
每當bean更改“bound”屬性時,都會觸發“PropertyChange”事件。
如果你覺得它不適合豆類,那么創建自己的豆
沒有理由使用事件來實現您的用例。 你是過度簡單的事情。 代碼應該如下所示:
@Override
public void actionPerformed(ActionEvent e) {
String login = loginTextField.getText();
char[] password = passwordField.getPassword();
boolean loginSuccessful = authenticationService.authenticate(login, password);
if (loginSuccessful) {
Main main = new Main();
main.setVisible(true);
this.setVisible(false);
}
else {
displayErrorMessage("Login failed");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.