[英]Is this reasoning about PropertyChangeListener correct?
我對使用PropertyChangeListener
接口有一些疑問。
我有一個名為GUI
的類,該類實現PropertyChangeListener
接口。
在此類中,我具有以下創建和顯示JFrame
( LoginFrame
是擴展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);
}
我的推理正確嗎?
謝謝
安德里亞
與其直接從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); }
看到,我們在更改具有相應屬性名稱的屬性時觸發該屬性。 優點是它增加了清晰度,並使代碼結構更具可讀性。
我不希望在監聽時對每個屬性進行條件檢查,而是要使用: addPropertyChangeListener("aProperty", PropertyChangeListener)
方法:該方法將偵聽由代替"aProperty"
定義的特定屬性更改。
如下面的@Hovercraft所建議,屬性名稱是一個公共的String常量,以免遇到拼寫或大小寫問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.