gpt4 book ai didi

java - ProgressBar propertychangeListener 在这种情况下不会更新

转载 作者:行者123 更新时间:2023-11-30 03:43:44 29 4
gpt4 key购买 nike

我在包含进度条的 MainPanel 中有一个静态 boolean 变量 inProgress。通信器类将此变量的值更改为 true false。

propertyListener如下

          @Override
public void propertyChange(PropertyChangeEvent evt) {

System.out.println("Property change check none");
if(true ==MainPanel.inProgress){
progressInformationPanel.getProgressBar().setIndeterminate(true);
progressInformationPanel.getCurrentProcesLabel().setText("Processing...");
}
else if(false ==MainPanel.inProgress){
System.out.println("Property change check none" + false);
progressInformationPanel.getProgressBar().setIndeterminate(false);
progressInformationPanel.getCurrentProcesLabel().setText("Finished....");
}
}
});

通信者类是一个观察者。那就是听其他课。现在,只要有进度通信器类就会更新 MainPanel 的变量,但 propertyChangeListener 不会起作用。我不知道为什么会发生这种情况。另请参阅我的链接 Question在这里

这是 SSCCE

import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JFrame;
import javax.swing.JProgressBar;


public class MainFrame extends JFrame{

public static boolean inProgress = true;
private JProgressBar bar;
public Communicator diplayFacade;
public MainFrame() {
this.setSize(500, 500);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
diplayFacade = new Communicator();
bar = new JProgressBar();
setLayout(new GridBagLayout());
add(bar);
addProgressListener();
}



public void addProgressListener(){
bar.addPropertyChangeListener(new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {

if(true == MainFrame.inProgress){
System.out.println("Property change check none" + true);
bar.setIndeterminate(true);
}
else if(false ==MainFrame.inProgress){
System.out.println("Property change check none" + false);
bar.setIndeterminate(false);

}


}
});
}

public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.diplayFacade.methodCalled();


}

}

以及 Communicator 类

import javax.swing.JOptionPane;

public class Communicator {



public void methodCalled(){

JOptionPane.showInputDialog("Hi");
MainFrame.inProgress = true;
}
}

最佳答案

问题是,我认为您不了解 PropertyChangeListener 的实际用途。 PropertyChangeListener 监视其注册到的 Object 属性的更改。

此通知不是偶然或自动发生的,您需要通常通过 PropertyChangeSupport 提供它,它可以帮助您管理 PropertyChangeListener 和触发事件...

通过将 PropertyChangeListener 添加到 JProgressBar,您可以监视它的更改,而不是您的框架。同样,通过从 PropertyChangeListener 内修改 JProgressBar 的状态,您可能会面临陷入无限循环的风险,因为该对象会尝试通知您所做的更改已经做了,一遍又一遍......

首先,你真的应该避免以这种方式使用static,最好有一个实例变量和一个setter来改变它的状态。您需要将框架的引用传递给那些对更改状态感兴趣的人,这会引发另一个问题,您确实不想不必要地公开程序的元素,因此最好将此功能包含在某些代码中某种界面,例如...

public interface Progressable {
public void addPropertyChangeListener(PropertyChangeListener listener);
public void removePropertyChangeListener(PropertyChangeListener listener);
public void setInProgress(boolean inProgress);
public boolean isInProgress();
}

然后你实现这个接口(interface)。然后,Communicator 将引用此接口(interface)的实例,并根据需要调用 setInProgress,例如...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MainFrame extends JFrame implements Progressable {

private JProgressBar bar;
public Communicator diplayFacade;
private boolean inProgress;

public MainFrame() {
diplayFacade = new Communicator(this);
bar = new JProgressBar();
setLayout(new GridBagLayout());
add(bar);
addPropertyChangeListener("inProgress", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (isInProgress()) {
bar.setIndeterminate(true);
} else {
bar.setIndeterminate(false);
}
}
});
}

@Override
public void setInProgress(boolean value) {
if (inProgress != value) {

inProgress = value;
firePropertyChange("inProgress", !inProgress, inProgress);

}
}

@Override
public boolean isInProgress() {
return inProgress;
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}

JFrame frame = new MainFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

}

关于java - ProgressBar propertychangeListener 在这种情况下不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26249944/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com