java - 如何查看两个可运行程序之间的通信以及进度

标签 java multithreading swing runnable jprogressbar

我有 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();
    }
}

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

最佳答案

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

将对 Controller 的引用传递给 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();
    }
}

关于java - 如何查看两个可运行程序之间的通信以及进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14664500/

相关文章:

Java swing计算器(相等的约束)

java - 在java中解析字符串数组

c++ - linux中的pthread_mutex_t是否可重入(如果一个线程试图获取它已经持有的锁,则请求成功)

java - 如何在 Java 中创建一个不同时运行某些任务的线程池?

java - 第一次尝试保存数据后,关闭程序后无法打开

java - 无法在 JFrame 中显示 JPEG 图像

java - 使用 Java 合并对 Map<String, Map<String, Integer>> 中的数字求和

java - 无法运行路径设置为 Java 6 的 Grails 2.1

java - Eclipse 中出现很多错误

c++ - 成员变量在另一个线程中没有改变?