0

値を設定するたびに再描画されない読み込みバーがあります。画面の最大化と最小化を何度も試みましたが、それでも 0% の進行状況が表示されます。コードはまだ完成していません。何か案が?コード:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class LoadingTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        F f = new F("Loading Bar Test");
    }
}
class F extends JFrame implements Runnable, ActionListener {
    private static final long serialVersionUID = 4684842549708528589L;
    private JProgressBar variableBar = new JProgressBar(0,100);
    private JProgressBar randomGenBar = new JProgressBar(0,100);
    private JProgressBar addBar = new JProgressBar(0,100);
    private JProgressBar totalbar = new JProgressBar(0,100);
    private JButton button;
    public F(String str) {
        setTitle(str);
        setDefaultCloseOperation(3);
        getContentPane().setLayout(new GridLayout(9,1));
        variableBar.setStringPainted(true);
        variableBar.setValue(0);
        button = new JButton("Run Tasks");
        button.addActionListener(this);
        add(button);
        add(new JLabel("Creating variables..."));
        add(variableBar);
        add(new JLabel("Generating Random Values..."));
        add(randomGenBar);
        add(new JLabel("Adding Values..."));
        add(addBar);
        add(new JLabel("Total Progress:"));
        add(totalbar);
        pack();
        setVisible(true);
    }
    public void run() {
        int p = 5;
        int i1;
        variableBar.setValue(p);
        int i2;
        p += 5;
        variableBar.setValue(p);
        int i3;
        p += 5;
        variableBar.setValue(p);
        int i4;
        p += 5;
        variableBar.setValue(p);
        int i5;
        p += 5;
        variableBar.setValue(p);
        int i6;
        p += 5;
        variableBar.setValue(p);
        int i7;
        p += 5;
        variableBar.setValue(p);
        int i8;
        p += 5;
        variableBar.setValue(p);
        int i9;
        p += 5;
        variableBar.setValue(p);
        int i10;
        p += 5;
        variableBar.setValue(p);
        int i11;
        p += 5;
        variableBar.setValue(p);
        int i12;
        p += 5;
        variableBar.setValue(p);
        int i13;
        p += 5;
        variableBar.setValue(p);
        int i14;
        p += 5;
        variableBar.setValue(p);
        int i15;
        p += 5;
        variableBar.setValue(p);
        int i16;
        p += 5;
        variableBar.setValue(p);
        int i17;
        p += 5;
        variableBar.setValue(p);
        int i18;
        p += 5;
        variableBar.setValue(p);
        int i19;
        p += 5;
        variableBar.setValue(p);
        int i20;
        p += 5;
        variableBar.setValue(p);
    }
    private F() {
    }
    public void actionPerformed(ActionEvent e) {
        new Thread(new F()).start();
    }
}
4

2 に答える 2

3

actionPerformed メソッドで新しい F オブジェクトを作成しています。その表示されていない F オブジェクトの JProgressBar は進行していますが、表示しているオブジェクトでは進行していません。

これを変更してみてください:

new Thread(new F()).start();

これに:

new Thread(this).start();

そして何が起こるか見てください。

余談ですが、バックグラウンド スレッドから Swing 呼び出しを行っていますが、これは絶対に行うべきではありません。代わりに、SwingWorker を使用し、その進行状況プロパティを設定してから、PropertyChangeListener を使用して Swing イベント スレッドでそのプロパティをリッスンします。

番号 2 はさておき: 書き込まれたバックグラウンド スレッドは瞬時に完了するため、段階的な進行は見られず、完了するまでの進行は瞬時に進行します。

于 2013-09-13T01:43:23.197 に答える
1

が入ってActionEventくると、すべての UI 更新が発生する必要があるイベント ディスパッチ スレッドではなくrun()、新しいメソッドでメソッドを起動します。Thread

于 2013-09-13T01:43:40.683 に答える