Как остановить SwingWorker из другого класса [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как остановить SwingWorker из другого класса [дубликат]

Сообщение Anonymous »

Я хочу остановить цикл 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, он работает так, как я хочу, но не знаю, правильно ли это использовать его таким образом.
Пожалуйста, помогите.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ther-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»