1

できれば不確定なポップアップ ダイアログの進行状況バーを作成しようとしていますが、それはあまり重要ではありません。「OracleのProgressBarチュートリアル」とGoogle検索を調べましたが、うまく機能しませんでした。アクション リスナーの下にコードを貼り付けましたが、ダイアログが表示されません。助言がありますか?前もって感謝します!

申し訳ありませんが、これはこのサイトでの私の最初の投稿です。しかし、それがどのように機能するかというと、作成ボタンを押すと、さまざまなサーバーやディレクトリから情報を取得してファイルを作成します。それが新しいプロジェクトです。Features は、私が作成した Enumeration でありJTextBox、作成ボタンのときにテキストが設定されています。問題は、このプロセスの処理に時間がかかることです。そのため、進行状況バーにその処理が表示されるようにしたい

private class CreateButton implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent arg0) { 
        class Task extends SwingWorker<Void, Void>
        {
            @Override
            protected Void doInBackground()
            {                   
                //Set Variables
                for(Feature f : Feature.values())
                {
                    if(f.getComp() != null)
                    {
                        f.getVariable().setVariable(((JTextField) f.getComp()).getText());
                    }
                }

                new Project(jobs.getSelectedValue().split("-")[0].trim(), 
                            jobs.getSelectedValue().split("-")[1].trim(),
                            features);
                return null;
            }
        }

        ProgressMonitor pm = new ProgressMonitor(display, "Testing...", "", 0, 100);
        pm.setProgress(0);
        Task task = new Task();
        task.execute();
    }

}   
4

3 に答える 3

1

私はあなたのSSCCEについて確信が持てなかったので、通常どのように機能するかを投稿してJProgressBarいます.

SwingWorkerJProgressBarについて読む

バックグラウンド プロセス中にプログレス バーを表示します。それがどのように機能するかの簡単な例が示されています。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class MyProgressBarTest {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            MyProgressBarTest obj = new MyProgressBarTest();
            obj.createGUI();
        }
    });
    }

    public void createGUI() {
        final JFrame frame = new JFrame();

        JPanel panel = new JPanel();
        final JButton button = new JButton("Progress");

        progressBar = new JProgressBar();

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {

                MyCustomProgressBarDialog progressBarObj = new MyCustomProgressBarDialog(progressBar, frame);
                progressBarObj.createProgressUI();

                MyActionPerformer actionObj = new MyActionPerformer(progressBar, progressBarObj, button);
                actionObj.execute();

            }
        });

        panel.add(button);
        frame.add(panel);

        frame.setTitle("JProgressBar Example");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocationRelativeTo(null);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }
}

class MyActionPerformer extends SwingWorker<String, Object> {

    JProgressBar fProgressBar;
    MyCustomProgressBarDialog progressDialog;
    JButton button;

    public MyActionPerformer(JProgressBar progressBar, MyCustomProgressBarDialog progressDialog, JButton button) {
        this.fProgressBar = progressBar;
        this.fProgressBar.setVisible(true);
        this.fProgressBar.setIndeterminate(true);
        this.button = button;
        this.progressDialog = progressDialog;

        this.button.setEnabled(false);
    }

    protected String doInBackground() throws Exception {

        calculateResult();
        return "Finished";
    }

    protected void done() {
        fProgressBar.setVisible(false);
        this.progressDialog.setVisible(false);
        this.button.setEnabled(true);
    }

    public void calculateResult() {
        for (int i = 0; i < 500000; i++) {
            System.out.println("Progress Bar: " + i);
        }
    }
}

class MyCustomProgressBarDialog extends JDialog {
    private static final long serialVersionUID = 1L;

    private static JProgressBar progressBar;
    private JFrame motherFrame;
    private JLabel label = new JLabel("loading.. ");
    private JButton button;

    public MyCustomProgressBarDialog(JProgressBar progressBar, JFrame frame) {

        this.progressBar = progressBar;
        this.motherFrame = frame;
        this.button = button;
    }

    public void createProgressUI() {
        add(label, BorderLayout.NORTH);
        add(progressBar, BorderLayout.CENTER);
        setSize(50, 40);
        setAlwaysOnTop(true);
        setLocationRelativeTo(motherFrame);
        setUndecorated(true);
        setVisible(true);
    }
}
于 2013-02-07T17:32:16.820 に答える
0

これは、ProgressMonitor用のOraclejavadocからのものです。

最初は、ProgressDialogはありません。最初のmillisToDecideToPopupミリ秒(デフォルトは500)の後、進行状況モニターは操作にかかる時間を予測します。それがmillisToPopup(デフォルトは2000、2秒)より長い場合、ProgressDialogがポップアップ表示されます。

作成してから少なくとも1/2秒後までポップアップしないことに注意してください。それでも、プロセスに2秒以上かかると予想される場合にのみポップアップします。

これはすべて、繰り返し呼び出した回数とsetProgress(int)、指定した範囲で値が進行するまでの時間に基づいています。

ダイアログがポップアップする条件が満たされていないようです。または、おそらく、その時間が経過する前にプログラムが終了します。

于 2013-02-07T17:12:06.000 に答える
0

属性を定義する必要があります

ProgressMonitor pm;

次に、合計進行サイズを作成する必要があります

int totalProgress = Feature.values().size();

次に、ループでカウントをインクリメントするだけです

int counter = 0;
for(Feature f : Feature.values())
{
  if (pm.isCanceled()) {
    pm.close();
    return null;
  }
  pm.setProgress(counter);
  pm.setNote("Task is " + counter*100/totalProgress + "% completed");
  counter++;

進捗モニターを呼び出す

pm = new ProgressMonitor(display, "Testing...", "", 0, totalProgress);

プロジェクトの作成などの他の部分に時間がかかる場合は、ジョブの大部分がループで実行されると想定しています。機能が完了した後で、パーセント カウントを追加しtotalProgressたり、モニターをリセットしたりできます。

于 2013-02-07T17:30:49.020 に答える