Я хочу остановить цикл for, который выполняется в другом классе Work, запущенном в doInBackground. Если я выполняю свою работу в методе doInBackground SwingWorker, я могу вызвать cancel(true) и проверить isCancelled().
В примере кода doInBackground вызывает метод в другой класс Work и запускает здесь цикл for. Чтобы остановить цикл, я использую if (Thread.currentThread().isInterrupted()), но я хочу знать, есть ли лучший способ.
class PBar extends JDialog {
JButton endButton ;
SwingWorker worker;
public PBar(JFrame parent) {
super(parent, "", true);
JProgressBar progressBar = new JProgressBar(0, 100);
progressBar.setStringPainted(true);
setLayout(new BorderLayout());
endButton = new JButton("Stop");
add(progressBar, BorderLayout.CENTER);
add(endButton, BorderLayout.SOUTH);
setSize(300, 120);
setLocationRelativeTo(this);
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
}
public void setCancelBtn() {
endButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
worker.cancel(true);
}
});
}
public void setWorker(SwingWorker worker) {
this.worker = worker;
}
public void stop() {
this.dispose();
}
}
class Work {
public void start() {
for (int i = 0; i < 1000000; i++) {
if (Thread.currentThread().isInterrupted()) {
break;
}
// try {
// Thread.sleep(500);
// } catch (InterruptedException e) {
// Thread.currentThread().interrupt();
// return;
// }
System.out.println(i);
}
}
}
class MainFrame extends JFrame {
public MainFrame() {
setTitle("Main");
setSize(400, 150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout());
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PBar pBar = new PBar(MainFrame.this);
SwingWorker worker = new SwingWorker() {
@Override
protected Void doInBackground() throws Exception {
Work work = new Work();
work.start();
return null;
}
@Override
protected void done() {
pBar.stop();
}
};
pBar.setWorker(worker);
worker.execute();
pBar.setCancelBtn();
pBar.setVisible(true);
}
});
JPanel panel = new JPanel();
panel.add(startButton);
add(panel, BorderLayout.NORTH);
}
}
public class SwingMain {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true);
}
});
}
}
Я записал свои мысли и результаты четырех методов ниже. Я не знаю, какой метод лучше.
Проверьте, передав SwingWorker или логическое значение в качестве параметра.
-> На самом деле это неэффективно потому что есть много классов, которые имеют к нему доступ.
Объявите логическое значение как глобальное или статическое и получите к нему доступ.
-> Я слышал, что использовать его в Swing нехорошо.< /li>
Проверьте, является ли CurrentThread прервано.
-> Я использовал этот метод, но не знаю, нормально ли это.
Создайте SwingWorker в цикле for WorkClass, а не в MainFrame.
-> JDialog не отображается во время предварительной работы, поэтому это может сбить пользователя с толку.
Если я использую метод 3, он работает так, как я хочу, но не знаю, правильно ли это использовать его таким образом.
Пожалуйста, помогите.
Я хочу остановить цикл for, который выполняется в другом классе Work, запущенном в doInBackground. Если я выполняю свою работу в методе doInBackground SwingWorker, я могу вызвать cancel(true) и проверить isCancelled(). В примере кода doInBackground вызывает метод в другой класс Work и запускает здесь цикл for. Чтобы остановить цикл, я использую if (Thread.currentThread().isInterrupted()), но я хочу знать, есть ли лучший способ. [code]class PBar extends JDialog { JButton endButton ; SwingWorker worker; public PBar(JFrame parent) { super(parent, "", true); JProgressBar progressBar = new JProgressBar(0, 100); progressBar.setStringPainted(true); setLayout(new BorderLayout());
JPanel panel = new JPanel(); panel.add(startButton);
add(panel, BorderLayout.NORTH); } }
public class SwingMain { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true); } }); } }
[/code] Я записал свои мысли и результаты четырех методов ниже. Я не знаю, какой метод лучше. [list] [*]Проверьте, передав SwingWorker или логическое значение в качестве параметра. -> На самом деле это неэффективно потому что есть много классов, которые имеют к нему доступ. [*]Объявите логическое значение как глобальное или статическое и получите к нему доступ. -> Я слышал, что использовать его в Swing нехорошо.< /li> Проверьте, является ли CurrentThread прервано. -> Я использовал этот метод, но не знаю, нормально ли это. [*]Создайте SwingWorker в цикле for WorkClass, а не в MainFrame. -> JDialog не отображается во время предварительной работы, поэтому это может сбить пользователя с толку. [/list] Если я использую метод 3, он работает так, как я хочу, но не знаю, правильно ли это использовать его таким образом. Пожалуйста, помогите.