我对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()
方法结合在一起,以获取并设置其属性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常量,以免遇到拼写或大小写问题。