プログレスバーを追加する方法を理解しようとしています。実装しているGUI内でプログレスバーを作成して表示することができますが、確認した後でも http://docs.Oracle.com/javase/tutorial /uiswing/components/progress.html メソッドを実行するためのプログレスバーを作成できるように、メソッドをタスクとして設定する方法がまだはっきりしていません。誰かが私にこれを説明しようとしたり、タスクがメソッドとして設定されたGUIで使用されているプログレスバーの例を投稿したりできますか?ありがとう。
たぶん私はいくつかのサンプルコードであなたを助けることができます:
public class SwingProgressBarExample extends JPanel {
JProgressBar pbar;
static final int MY_MINIMUM = 0;
static final int MY_MAXIMUM = 100;
public SwingProgressBarExample() {
// initialize Progress Bar
pbar = new JProgressBar();
pbar.setMinimum(MY_MINIMUM);
pbar.setMaximum(MY_MAXIMUM);
// add to JPanel
add(pbar);
}
public void updateBar(int newValue) {
pbar.setValue(newValue);
}
public static void main(String args[]) {
final SwingProgressBarExample it = new SwingProgressBarExample();
JFrame frame = new JFrame("Progress Bar Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(it);
frame.pack();
frame.setVisible(true);
// run a loop to demonstrate raising
for (int i = MY_MINIMUM; i <= MY_MAXIMUM; i++) {
final int percent = i;
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
it.updateBar(percent);
}
});
Java.lang.Thread.sleep(100);
} catch (InterruptedException e) {
;
}
}
}
}
あなたの質問は少し曖昧ですが、進行状況バーに特定の実行中のメソッドの進行状況を表示したいように思えます。これを「work()」メソッドと呼びます。残念ながら、メソッドへの参照をプログレスバーに渡すだけの方法はありません。メソッドは、プログレスバーに何を表示するかを明示的に指示する必要があります。これが私がすることです:
プログレスバーの参照をwork()で使用できるようにします。これをwork()の引数として渡すか、work()のコードがプログレスバーへの参照を取得するために呼び出すことができるアクセサーメソッドを提供します。
Work()内で、プログレスバーへの参照を取得した後(これを「pb」と呼びます。pb.setMinimum(0)およびpb.setMaximum(n)を呼び出します。ここで、nはメソッドのステップ数です。通過する。
メソッドが各ステップを完了したら、pb.setValue(pb.getValue()+ 1);を呼び出します。
メソッドの最後で、pb.setValue(0);を呼び出します。戻る前にプログレスバーをリセットします。
また、プログレスバーに文字列メッセージを表示する場合は、最初にpb.setStringPainted(true)を呼び出す必要があります。その後、pb.setString(string)を呼び出すとプログレスバーに表示されます。
別のSO質問 に関する私の回答を参照してください。これには、JProgressBar
を使用して更新されるSwingWorker
の例が含まれています。SwingWorker
は、長時間実行されるタスクをバックグラウンドで実行するために使用されます(例の場合、通常のThread.sleep
)そして一定の間隔で進捗状況を報告します。
また、UIに干渉する長時間実行タスクを実行するときにSwingWorker
を使用する必要がある理由の背景情報については、 Swing同時実行チュートリアル を参照することを強くお勧めします。
私が投稿したものと同様の例が JProgressBar
sに関するSwingチュートリアル にあります。これも一見の価値があります
これはどう、
JFrame-> JButton(BorderLayout.NORTH)
JFrame-> JPanel-> JProgressBar(BorderLayout.SOUTH)
Progress progress = ...; state=true; progress.waitFor(); state=false;
の場合など、好きな場所にボタンパーツを追加できます。
private static void daa() {
//Frame
JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.setSize(frame.getWidth() + 55, frame.getHeight() + 55);
//Button
JButton jButton = new JButton("State");
frame.add(jButton, BorderLayout.NORTH);
//Progress Bar
JProgressBar progressBar = new JProgressBar();
progressBar.setIndeterminate(true);
//Text for progress bar
JPanel panel = new JPanel(new BorderLayout());
panel.add(progressBar);
panel.add(new JLabel("Please wait......."), BorderLayout.PAGE_START);
//linking
panel.add(progressBar);
frame.add(panel, BorderLayout.SOUTH);
boolean[] state = {false};
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
state[0] = !state[0];
state();
}
private void state() {
if (state[0] == true) {
panel.hide();
} else {
panel.show();
}
}
});
}