Java PropertyChangeListener
我想知道如何在另一个类中监听属性更改。下面是我的代码: ClassWithProperty具有我要侦听的属性:Java PropertyChangeListener,java,Java,我想知道如何在另一个类中监听属性更改。下面是我的代码: ClassWithProperty具有我要侦听的属性: public class ClassWithProperty { private PropertyChangeSupport changes = new PropertyChangeSupport(this); private int usersOnline; public int getUsersOnline() { return user
public class ClassWithProperty {
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
private int usersOnline;
public int getUsersOnline() {
return usersOnline;
}
public ClassWithProperty() {
usersOnline = 0;
while (usersOnline<10) {
changes.firePropertyChange("usersOnline", usersOnline, usersOnline++);
}
}
public void addPropertyChangeListener(
PropertyChangeListener l) {
changes.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(
PropertyChangeListener l) {
changes.removePropertyChangeListener(l);
}
}
我只在最后一次触发了事件(usersOnline=10)。
我是Java新手,试图找到解决方案,但没有成功。您的方法如下:
public ClassWithProperty() {
usersOnline = 0;
while (usersOnline<10) {
changes.firePropertyChange("usersOnline", usersOnline, usersOnline++);
usersOnline++;
}
}
public ClassWithProperty(){
usersOnline=0;
而(usersOnline代码:
private static PropertyChangeListener listen() {
System.out.println(test.getUsersOnline());
return null;
}
返回null
表示“无对象”,这又表示test.addPropertyChangeListener(listen())
实际上是test.addPropertyChangeListener(null)
,它不会注册任何内容
必须将PropertyChangeListener
的有效实例传递给addPropertyChangeListener()
方法
编辑
我建议您阅读Java教程中关于PropertyChangeListeners的章节:
代码的另一个问题是,在ClassWithProperty
的构造函数中调用firePropertyChange()
。但是在那时,不可能注册任何侦听器,因此它没有任何效果。对addPropertyChangeListener()
的任何调用都发生在您触发事件之后
以下是您的代码修改,以使其能够正常工作(但尚未对其进行测试…):
公共类ClassWithProperty{
私有PropertyChangeSupport更改=新的PropertyChangeSupport(此);
私有int usersOnline=0;
公共类WithProperty(){
}
public void setupOnlineUsers()
{
while(usersOnline<10){
changes.firePropertyChange(“usersOnline”,usersOnline,++usersOnline);
}
}
public int getUsersOnline(){
返回usersOnline;
}
public void addPropertyChangeListener(PropertyChangeListener l){
更改。addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l){
更改。removePropertyChangeListener(l);
}
}
公共类MainListener实现PropertyChangeListener{
私有类属性测试;
公共MainListener(){
test=新类WithProperty();
test.addPropertyChangeListener(此);
test.setupOnlineUsers();
}
公共作废属性更改(属性更改事件evt){
System.out.println(test.getUsersOnline());
}
公共静态void main(字符串[]args){
new MainListener();//在构造函数中执行所有操作
}
}
我要做的是在ClassWithProperty类中放置一个方法:
public PropertyChangeSupport getPropertyChangeSupport() {
return changes;
}
然后,在Main()类的构造函数中注册属性更改事件:
这使得您不会使用PropertyChangeSupport类中已有的方法重复ClassWithProperty中的代码
当您需要在ClassWithProperty类中触发事件时,请执行以下操作:
changes.firePropertyChange("usersOnline", oldValue, newValue);
该方法的一个显著特点是,如果
event.getOldValue()和event.getNewValue()的
如果相同,则不会激发事件。如果要激发具有相同信息的重复事件,请在oldValue字段中使用null;
火属性更改()方法只传递int、boolean和Object。因此,如果不传递int或boolean,则需要强制转换在接收端的事件中传递的值。可能与您的问题无关,但代码中的一个问题是,每次循环迭代都会将usersOnline增加两次。只使用++一次。是的,我的错误,但问题是lem仍然存在。谢谢;)您能将我的代码与示例集成吗?抱歉,我是Java初学者,无法理解它。对我来说,由于我的英语也很差(我来自意大利)。非常感谢。您指向绑定属性的链接已断开,请尝试
public PropertyChangeSupport getPropertyChangeSupport() {
return changes;
}
private void initializeListeners() {
test.getPropertyChangeSupport().addPropertyChangeListener((PropertyChangeEvent event) -> {
if (event.getPropertyName().equals("usersOnline")) {
String passedEventData = (String) event.getNewData();
}
});
}
changes.firePropertyChange("usersOnline", oldValue, newValue);