Java 这个关于PropertyChangeListener的推理正确吗?

Java 这个关于PropertyChangeListener的推理正确吗?,java,swing,events,propertychangelistener,Java,Swing,Events,Propertychangelistener,我对PropertyChangeListener接口的使用有一些疑问 我有一个名为GUI的类,它实现了PropertyChangeListener接口 在这个类中,我使用以下方法创建并显示JFrame(LoginFrame是一个扩展JFrame的自定义类): 因此,在我的LoginFrame对象上,我添加了一个PropertyChangeListener。因此,我认为我正在添加一种机制,当更改此对象中属性的值时,它会通知此更改,该更改将由以下方法处理(在我的GUI类中声明): 在我的LoginF

我对
PropertyChangeListener
接口的使用有一些疑问

我有一个名为
GUI
的类,它实现了
PropertyChangeListener
接口

在这个类中,我使用以下方法创建并显示
JFrame
LoginFrame
是一个扩展
JFrame
的自定义类):

因此,在我的
LoginFrame
对象上,我添加了一个
PropertyChangeListener
。因此,我认为我正在添加一种机制,当更改此对象中属性的值时,它会通知此更改,该更改将由以下方法处理(在我的
GUI
类中声明):

在我的
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 performed函数触发属性更改,不如扩展您的目标bean类,定义一个
    setXXX()
    方法来更改
    xxx
    属性。所有Java bean都与
    getXXX()
    setXXX()
    方法合并,以获取和设置它们的属性
    xxxx
    。更改属性的是
    setXXX()。我们应该在更改属性后触发该属性,在上下文中我们正在更改它,因此它是
    setXXX()
    方法。让我们看看
    组件的setPreferredSize(dimension)方法源代码
    类:

     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所建议的,属性名称必须是公共字符串常量,以免出现拼写或大写问题


  • 是的,你的推理看起来不错。你有问题吗?你试过了吗?没有,代码不是我的,我也不确定关于它的推理是否正确。你不明白上面的代码是什么?+1,但我建议属性名是一个公共字符串常量,以免遇到拼写或大写问题。谢谢你的提述。在答案中添加了建议
    @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);   
    
    }
    
     public void setPreferredSize(Dimension preferredSize) {
    
        if (prefSizeSet) {
            old = this.prefSize;
        }
        else {
            old = null;
        }
        this.prefSize = preferredSize;
        prefSizeSet = (preferredSize != null);
        firePropertyChange("preferredSize", old, preferredSize);
    }