关于PropertyChangeListener的推理是否正确?

时间:2013-11-18 17:55:28

标签: java swing events propertychangelistener

我对使用PropertyChangeListener界面有疑问。

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

在本课程中,我使用以下方法创建并显示JFrameLoginFrame是一个扩展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);   

}

我的推理是否正确?

由于

安德烈

1 个答案:

答案 0 :(得分:1)

  1. 不是直接从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);
    }
    

    请参阅,我们在更改属性时使用相应的属性名称触发该属性。优点是它增加了更好的清晰度并使代码结构更具可读性。

  2. 我不想在收听时使用每个属性进行条件检查,而是使用:addPropertyChangeListener("aProperty", PropertyChangeListener)方法:它将监听由"aProperty"定义的特定属性更改。

  3. 根据以下@Hovercraft的建议,属性名称是公共String常量,以免遇到拼写或大写问题。