我对使用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);
}
我的推理是否正确?
由于
安德烈
答案 0 :(得分:1)
不是直接从Action执行的函数触发属性更改,而是更好地扩展目标bean类,定义setXXX()
方法来更改xxx
属性。全部Java bean与getXXX()
和setXXX()
方法结合使用以获取和设置其属性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常量,以免遇到拼写或大写问题。