1

a.java クラス (形式) にプログレスバーがあります。b.java クラスからアクセスする必要があります。プログレスバーの名前は jprog です (パレットからフォームに入れました) プログレスバーを公開するにはどうすればよいですか? プロパティページで見つけることができません。ファーストクラスの私のプログレスバー。しかし、私はその価値をセカンドクラスで変えたいと思っています。ありがとう。

4

3 に答える 3

1

プログレスバーを更新するクラスメソッドを追加できます。その後、進行状況バーに直接触れる必要はありません。

于 2012-09-07T07:02:13.897 に答える
1

PropertyChangeListener最初のクラスにa を追加し、2 番目のクラスで a を使用することを検討してくださいSwingWorker。SwingWorker には、setProgress()進行状況バーの値を設定するために呼び出すことができるメソッドがあります。propertyChange()次に、最初のクラスでメソッドをオーバーライドして、次のようにすることができます。

public void propertyChange(PropertyChangeEvent evt) {
    if ("progress" == evt.getPropertyName()) {
      int progress = (Integer) evt.getNewValue();
      progressBar.setValue(progress);
    }
}

ClassAClassBの 2 つのクラスを使用した例は、次のようになります。

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;
        }
}
于 2012-09-07T07:09:13.673 に答える
0

ClassA のボタンを押して更新する必要があるときにプログレスバーを更新したい場合は、Sujay のソリューションをお勧めしますが、Runnable コンテキストを使用してメソッドを呼び出す必要があります。プログレスバーの更新をブロックする可能性のあるイベントディスパッチスレッドのコンテキスト内でアクションを実行しないようにすることが重要です

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

        @Override
        public void run() {

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

        }
    });

}
于 2016-06-08T13:33:51.017 に答える