Java 如何从不同的班级到达progressbar?

Java 如何从不同的班级到达progressbar?,java,netbeans,Java,Netbeans,我在a.java类中有一个progressbar(在表单中)。我需要从b.java类访问它。 我的progressbar名称是jprog。(我从palet中以表格形式输入) 如何设置公共进度条?我在属性页找不到它。 我的孩子在头等舱。但我想在二等舱改变它的值。 谢谢。您可以向类中添加一个方法,该方法将更新进度条。然后,您不必直接触摸进度条 考虑在第一节课中添加一个PropertyChangeListener,在第二节课中使用一个SwingWorker。SwingWorker有一个名为的方法,您可

我在a.java类中有一个progressbar(在表单中)。我需要从b.java类访问它。 我的progressbar名称是jprog。(我从palet中以表格形式输入) 如何设置公共进度条?我在属性页找不到它。
我的孩子在头等舱。但我想在二等舱改变它的值。
谢谢。

您可以向类中添加一个方法,该方法将更新进度条。然后,您不必直接触摸进度条

考虑在第一节课中添加一个
PropertyChangeListener
,在第二节课中使用一个
SwingWorker
。SwingWorker有一个名为的方法,您可以调用该方法来设置进度条的值。然后,您可以在第一个类中重写
propertyChange()
方法,并执行如下操作:

public void propertyChange(PropertyChangeEvent evt) {
    if ("progress" == evt.getPropertyName()) {
      int progress = (Integer) evt.getNewValue();
      progressBar.setValue(progress);
    }
}
使用两个类(ClassA和ClassB)的示例如下所示:

public ClassA extends JForm implements PropertyChangeListener{
    private JProgressBar progressBar;

    public ClassA(){
        /**
        * Your setup for the form
        */
    }

     /**
     * Invoked when task's progress property changes.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            progressBar.setValue(progress);
        }
    }

    public void someMethod(){
        ClassB classB = new ClassB();
        classB.addPropertyChangeListener(this);
        classB.execute();
    }
}

class ClassB extends SwingWorker<Void, Void> {
        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
            Random random = new Random();
            int progress = 0;
            //Initialize progress property.
            setProgress(0);
            //Sleep for at least one second to simulate "startup".
            try {
                Thread.sleep(1000 + random.nextInt(2000));
            } catch (InterruptedException ignore) {}
            while (progress < 100) {
                //Sleep for up to one second.
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException ignore) {}
                //Make random progress.
                progress += random.nextInt(10);
                setProgress(Math.min(progress, 100));
            }
            return null;
        }
}
public ClassA扩展JForm实现PropertyChangeListener{
私人JProgressBar progressBar;
公共甲级(){
/**
*您的表单设置
*/
}
/**
*当任务的进度属性更改时调用。
*/
公共作废属性更改(属性更改事件evt){
if(“progress”==evt.getPropertyName()){
int progress=(整数)evt.getNewValue();
progressBar.setValue(进度);
}
}
公共方法(){
ClassB ClassB=新的ClassB();
classB.addPropertyChangeListener(此);
classB.execute();
}
}
类B扩展了SwingWorker{
/*
*主任务。在后台线程中执行。
*/
@凌驾
公共无效doInBackground(){
随机=新随机();
int progress=0;
//初始化进度属性。
setProgress(0);
//睡眠至少一秒钟以模拟“启动”。
试一试{
Thread.sleep(1000+random.nextInt(2000));
}捕获(中断异常忽略){}
而(进度<100){
//最多睡一秒钟。
试一试{
Thread.sleep(random.nextInt(1000));
}捕获(中断异常忽略){}
//随机取得进展。
进度+=随机。下一步(10);
setProgress(Math.min(progress,100));
}
返回null;
}
}

如果您想在需要通过按下ClassA上的按钮来更新progressbar,我仍然建议使用Sujay的解决方案,但您需要使用Runnable上下文调用您的方法。避免在事件调度线程的上下文中执行可能阻止progressBar更新的操作非常重要

public void someMethod(){
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {

            // Some stuff
            classB.addPropertyChangeListener(this);
            classB.execute();

        }
    });

}

我不明白你的意思。请解释一下我的进步在头等舱。但我想在秒内改变它的值class@ErsinGulbahar:我更新了我的答案,说明了如何实现这一点。请注意,my
ClassA
是一个包含
JProgressBar
的类,我希望根据特定条件从另一个类
ClassB
更新其值。希望这有帮助:)@Sujay我试着在我的代码中使用这种方式,但区别在于classB.execute();将在我按下ClassA中的按钮时调用。按钮一直切换,直到“我的任务”完成,最后进度条立即变为100%。我有什么问题?