【发布时间】:2013-11-29 01:44:19
【问题描述】:
我对 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 事件本身包含以下信息:
propertyName 是可以更改的属性的名称(在我的示例中名为 loginResult,因为我有一个名为 的布尔变量loginResult,如果用户点击按钮可以登录,则为true,否则为false
old value 是可以更改的属性的旧值(在我的示例中为 false,因为如果用户看到登录窗口,则意味着它没有登录并且loginResul=false
新值:在这种情况下,它是 loginResult 变量的内容(如果用户正在系统中登录,则为 true)
所以这个 PropertyChange 事件将被我的 propertyChange() 方法(在侦听器类中声明)拦截,该方法根据这些参数处理它:例如在下面方式:
** 如果propertyName 是loginResult 并且如果新值为true,则不再显示登录窗口,而是显示主应用程序窗口**
我的推理是否正确,这可能是使用 PropertyChangeListener 接口的好方法吗?
Tnx
安德烈亚
【问题讨论】:
-
您到底想达到什么目的?每次单击按钮时创建一个新的 Main 并添加一个新的侦听器看起来完全错误,但我不确定你想做什么。登录成功是否显示主框架?
-
作为一般性注释,以便我们集中在一个共同的词汇上,java 中的事件不是被拦截的;这意味着在听众得到它们之后它们会去其他地方。您可以使用“已收到”或“已处理”。我不知道这是否是其他语言的正确术语,但我从未在 java 中听说过它
-
@JBNizet 是的,如果登录成功,我想显示主框架。你完全正确:每次用户单击按钮时创建一个新的 Main 对象是非常愚蠢的事情......所以现在我将它创建一次作为没有 LoginFrame 构造函数的静态变量......所以我认为它更好
标签: java swing user-interface propertychangelistener propertychangesupport