PropertyChangeListener

PropertyChangeListener

我对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()方法结合在一起,以获取并设置其属性xxxxsetXXX()是更改属性的那个。我们应该触发该属性,在更改属性后,在上下文中对其进行更改,因此它是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常量,以免遇到拼写或大小写问题。

07-26 07:47