这是使用PropertyChangeListener接口的好方法吗?

时间:2013-11-15 15:45:28

标签: java swing user-interface propertychangelistener propertychangesupport

我怀疑与 fireIndexedPropertyChange()方法的深层含义和用法有关,该方法会触发将被 propertyChange()侦听器拦截和处理的事件我在另一个班级宣布。

例如,在使用JButton实现登录GUI(显示登录表单)的类中,我有这个方法,当用户登录我的按钮时执行:

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    System.out.println("Button cliccked");

    Main listener = new Main();                         // I intantiate a new Main object to have the PropertyChangeListener
    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: 
     * 
     * @param "loginButtonClicked" 
     * */
    firePropertyChange("loginResult", false, loginResult);   


}

因此,当尚未登录的用户点击我的按钮时,会执行此方法并触发新的 PropertyChange 事件。

我的 PropertyChange 事件会自行获取以下信息:

  1. propertyName ,它是可以更改的属性的名称(在我的示例中名为 loginResult ,因为我有一个名为的布尔变量loginResult ,如果用户可以在clikc按钮时登录,则值为true,否则为false

  2. 旧值是可以更改的属性的旧值(在我的示例中为false,因为如果用户看到登录窗口,则表示它未登录并且 loginResul = false

  3. 新值:在这种情况下,它是 loginResult 变量的内容(如果用户正在登录系统,则为true)

  4. 所以这个 PropertyChange 事件将被我的 propertyChange()方法(在侦听器类中声明)拦截,该方法根据这些参数处理它:例如,在下面方式:

    **如果propertyName是loginResult,如果新值为true,则不再显示登录窗口但显示主应用程序窗口**

    我的推理是否正确,这可能是使用 PropertyChangeListener 界面的好方法吗?

    TNX

    安德烈

2 个答案:

答案 0 :(得分:1)

你可以像这样使用它,它会起作用。但我认为你的问题更多的是关于语义,而不仅仅是它是否有效。该接口的包是java.beans,它将它放在bean的上下文中。如果您在bean上下文中使用它,即您的事件发布者是bean,那么我认为接口的“深层含义”与您的使用一致。 javadoc说

  

每当bean更改“绑定”属性时,都会触发“PropertyChange”事件。

如果您觉得豆子不顺利,那就创建自己的

答案 1 :(得分:1)

没有理由使用事件来实现您的用例。你是过度简单的事情。代码应该如下所示:

@Override
public void actionPerformed(ActionEvent e) {
    String login = loginTextField.getText();
    char[] password = passwordField.getPassword();
    boolean loginSuccessful = authenticationService.authenticate(login, password);
    if (loginSuccessful) {
        Main main = new Main();
        main.setVisible(true);
        this.setVisible(false);
    }
    else {
        displayErrorMessage("Login failed");
    }
}