簡體   English   中英

關於PropertyChangeListener的這種推理正確嗎?

[英]Is this reasoning about PropertyChangeListener correct?

我對使用PropertyChangeListener接口有一些疑問。

我有一個名為GUI的類,該類實現PropertyChangeListener接口。

在此類中,我具有以下創建和顯示JFrameLoginFrame是擴展JFrame的自定義類):

private void showLoginFrame() {
    loginFrame = new LoginFrame();
    loginFrame.setVisible(true);
    loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Notify every change to every bound property for that object:
    loginFrame.addPropertyChangeListener(this);
}

因此,在我的LoginFrame對象上,添加一個PropertyChangeListener 因此,我認為我正在添加一種機制,當更改此對象中的屬性值時,它將通知此更改,該更改將通過以下方法(在我的GUI類中聲明)進行處理:

@Override
public void propertyChange(PropertyChangeEvent arg0) {
    System.out.println("GUI SingleFrameApplication ---> propertyChange(): " + arg0.getPropertyName());

    if (arg0.getPropertyName().equals("buttonLogOffClicked")) {
        //System.out.println("GUI SingleFrameApplication ---> richiamo exit");
        //exit();

        mainFrame.OnWindowClose();
        mainFrame.dispose();
        mainFrame = null;

        showLoginFrame();
    }

    if (arg0.getPropertyName().equals("loginResult")) {
        System.out.println("GUI SingleFrameApplication ---> richiamo MainFrame");
        //loginFrame.setVisible(false);
        loginFrame.dispose();
        loginFrame = null;

        showMainFrame();
    }

}

在我的LoginFrame類中的特定情況下,我有一個JButton ,如果單擊該按鈕將觸發將由先前方法處理的事件,方法是:

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Button LogIn cliccked");

  //  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: 

    firePropertyChange("loginResult", false, loginResult);   

}

我的推理正確嗎?

謝謝

安德里亞

  1. 與其直接從Action執行的函數中觸發屬性更改,不如更好地擴展您的目標bean類,而是定義一個setXXX()方法來更改xxx屬性。 所有Java bean都與getXXX()setXXX()方法結合在一起,以獲取和設置其Property xxxx setXXX()是更改屬性的那個。 我們應該觸發該屬性,在更改屬性后,在上下文中對其進行更改,因此它是setXXX()方法。 讓我們看一下Component類的setPreferredSize(Dimesion)方法源代碼:

      public void setPreferredSize(Dimension preferredSize) { if (prefSizeSet) { old = this.prefSize; } else { old = null; } this.prefSize = preferredSize; prefSizeSet = (preferredSize != null); firePropertyChange("preferredSize", old, preferredSize); } 

    看到,我們在更改具有相應屬性名稱的屬性時觸發該屬性。 優點是它增加了清晰度,並使代碼結構更具可讀性。

  2. 我不希望在監聽時對每個屬性進行條件檢查,而是要使用: addPropertyChangeListener("aProperty", PropertyChangeListener)方法:該方法將偵聽由代替"aProperty"定義的特定屬性更改。

  3. 如下面的@Hovercraft所建議,屬性名稱是一個公共的String常量,以免遇到拼寫或大小寫問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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