0

我有 2 个类 .java

主要的 :

public class Controller extends javax.swing.JFrame
{   
    public static void updateProgressBar(int i) {
        jProgressBar1.setValue(i);
        jProgressBar1.repaint();
    }

    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Controller app = new Controller();
                app.setVisible(true);
                app.setResizable(false);
            }
        });
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        ChildModel model = new ChildModel();
        Thread t1 = new Thread(model);
        t1.start();
    }

    private javax.swing.JProgressBar jProgressBar1; //Initialized with Netbeans builder
}

我的 ChildModel (ChildModel.java) 计算一些代码(大约需要 10-20 秒),我想显示父类 (Controller.java) 的进度。

这是我的 ChildModel :

public class ChildModel implements Runnable
{
    public ChildModel(){ /* Something */ }

    public void complexMath()
    {
        //Lots of logic here
        Controller.updateProgression(purcent);
    }

    @Override
    public void run() {
        complexMath();
    }
}

问题显然是我的静态 void updateProgressBar 无法修改非静态变量。我怎样才能做到这一点?

4

2 回答 2

2

jProgressBar1变量是一个实例变量,因此您无法从静态方法访问它。并且该方法不应该是静态的:您想要更新控制器中的进度,而不是所有控制器实例。

将控制器的引用传递给 ChildModel,并使用 ChildModel 中的此引用来更新进度条。还要记住,所有 Swing 交互都必须在 EDT 中完成,而不是在后台线程中。所以代码应该是这样的:

public class Controller extends javax.swing.JFrame
{   
    public void updateProgressBar(int i) {
        jProgressBar1.setValue(i);
        // no need for repaint. The progress bar knows it must be repainted 
        // when its value changes
    }

    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Controller app = new Controller();
                app.setVisible(true);
                app.setResizable(false);
            }
        });
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        ChildModel model = new ChildModel(this);
        Thread t1 = new Thread(model);
        t1.start();
    }

    private javax.swing.JProgressBar jProgressBar1; //Initialized with Netbeans builder
}

public class ChildModel implements Runnable
{

    private Controller controller;

    public ChildModel(Controller controller){
        this.controller = controller;
    }

    public void complexMath()
    {
        //Lots of logic here
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                controller.updateProgression(percent);
            }
        });
    }

    @Override
    public void run() {
        complexMath();
    }
}
于 2013-02-02T17:40:11.553 回答
2

Swing 有自己的并发机制来处理更新组件。在这里,您可以使用Swing Timer并更新JProgressBar. 您可以使用 a作为类成员变量并传入您的 instance ,而不是使用ChildModelimplement ,以便在需要时调用。RunnableTimerjProgressBar1setValue

于 2013-02-02T17:37:39.020 回答