わかりました、私は再びダミーの質問をするためにここにいます。カスタム ダイアログ フレームがあり、その上にプログレス バーがあります。それで、私は遺伝的アルゴリズムも持っています(これはかなりの時間機能します)。
すべての状況を理解しているので、アルゴリズム、プログレス バーに対して個別のスレッドを実行し、ダイアログのメイン スレッドを残す必要があります (ユーザー アクションに応答する機会を与えるため)。そこで、これを実装しようとしましたが、次の結果が得られました。
public class ScheduleDialog extends JDialog {
private final JPanel contentPanel = new JPanel();
private static Data data;
private static GeneticEngine geneticEngine;
private static Schedule schedule;
private static JProgressBar progressBar;
private static JLabel statusLabel;
public static void showProgress() {
try {
ScheduleDialog dialog = new ScheduleDialog();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
startScheduleComposing();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void startScheduleComposing() {
BackGroundWorker backGroundWorker = new BackGroundWorker();
GeneticEngineWorker geneticEngineWorker = new GeneticEngineWorker();
new Thread(geneticEngineWorker).start();
new Thread(backGroundWorker).start();
}
private ScheduleDialog() {
this.data = Data.getInstance();
setTitle("");
setModal(true);
setBounds(100, 100, 405, 150);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension dialogSize = getSize();
setLocation((screenSize.width - dialogSize.width) / 2, (screenSize.height - dialogSize.height) / 2);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(new GridLayout(0, 1, 0, 0));
{
progressBar = new JProgressBar();
progressBar.setBackground(Color.RED);
contentPanel.add(progressBar);
}
{
statusLabel = new JLabel("");
contentPanel.add(statusLabel);
}
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("Прервать");
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
}
}
protected static class BackGroundWorker implements Runnable {
@Override
public void run() {
while(true){
int barValue = 100 - (geneticEngine.getCurrentBestFitness() / geneticEngine.getInitialFitness());
progressBar.setValue(barValue);
progressBar.repaint();
statusLabel.setText(String.valueOf(geneticEngine.getCurrentBestFitness()));
statusLabel.repaint();
try{
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
protected static class GeneticEngineWorker implements Runnable{
@Override
public void run() {
geneticEngine = new GeneticEngine(data);
schedule = geneticEngine.GeneticAlgorithm();
}
}
}
それは機能しているようですnew Thread(geneticEngineWorker).start();
が、プログレスバーでは何も起こりません。コードのこの部分だと思います:
private static void startScheduleComposing() {
BackGroundWorker backGroundWorker = new BackGroundWorker();
GeneticEngineWorker geneticEngineWorker = new GeneticEngineWorker();
new Thread(geneticEngineWorker).start();
new Thread(backGroundWorker).start();
}
停止された後にnew Thread(backGroundWorker).start();
のみ実行されます。
私が正しければ、コードを再編成して機能させる方法を教えてください。もし私が間違っていれば、間違いを指摘してもらえますか? new Thread(geneticEngineWorker).start();
よろしくお願いします!
添加
私はそれをデバッグし、思ったように、backGroundWorker は、geneticEngineWorker が終了するか、ユーザーがダイアログを閉じた後にのみ機能し始めます (この場合は例外)。