簡體   English   中英

這是使用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事件帶有以下信息:

  1. propertyName是可以更改的屬性的名稱(在我的示例中名為loginResult,因為我有一個名為loginResult的布爾變量,如果用戶可以在clikc按鈕時登錄,則值為true,否則為false

  2. 舊值是可以更改的屬性的舊值(在我的示例中為false,因為如果用戶看到登錄窗口,則表示它未登錄且loginResul = false

  3. 新值 :在這種情況下,它是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM