0

我对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);   

}

我的推理正确吗?

谢谢

安德烈亚

4

1 回答 1

1
  1. 与其直接从 Action 执行函数触发属性更改,不如更好地扩展您的目标 bean 类,定义一个setXXX()更改xxx属性的方法。所有 Java bean 都结合了获取和设置其 Property 的getXXX()方法。这是改变财产的人。我们应该触发属性,在我们更改属性之后,在上下文中我们正在更改它,因此它是方法。让我们看一下类的 setPreferredSize(Dimesion) 方法源代码:setXXX()xxxxsetXXX()setXXX()Component

     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 所推荐的,属性名称是一个公共字符串常量,以免遇到拼写或大写问题。

于 2013-11-18T18:07:01.087 回答