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)の進行状況を表示したいと思います。

これが私のチャイルドモデルです:

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

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

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

問題は明らかに、非静的変数を変更できない静的なvoidupdateProgressBarです。どうすればこれを達成できますか?

4

2 に答える 2

2

変数はjProgressBar1インスタンス変数であるため、静的メソッドからアクセスすることはできません。また、メソッドは静的であってはなりません。すべての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();
    }
}
于 2013-02-02T17:40:11.553 に答える
2

Swingには、コンポーネントの更新を処理するための独自の同時実行メカニズムがあります。ここでは、スイングタイマーを使用してを更新できますJProgressBarChildModelを実装 するのではなく、をクラスメンバー変数としてRunnable使用してインスタンスに渡すことで、必要に応じて呼び出すことができます。TimerjProgressBar1setValue

于 2013-02-02T17:37:39.020 に答える