0

我对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的布尔变量,如果用户可以在单击按钮时登录,则值为 true,否则为 false

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

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

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

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

我的推理是否正确,它可能是使用PropertyChangeListener接口的好方法?

肿瘤坏死因子

安德烈亚

4

2 回答 2

1

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

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

如果您认为 bean 不适合,请创建您自己的

于 2013-11-15T16:01:12.303 回答
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");
    }
}
于 2013-11-15T16:17:42.120 回答