У меня возникли проблемы с темой моего рабочего качания, и проблема в том, когда я отменяю.По сути, у меня есть кнопка запуска, которая при нажатии запускает мой рабочий.
Отсюда мой качельщик делает несколько небольших вещей, но главное, что он выполняет некоторые длительные вызовы рефлексии.
У меня также есть кнопка отмены, которая, как вы, наверное, догадались, отменяет мой рабочий.Однако проблема в том, что у меня есть ошибка, которую я просто не могу точно определить.
После отмены приложения в середине его первого запуска, рабочий Swing отменяет все отлично, однако, если я затем нажимаю кнопку «Пуск» снова и позволяю ему запускаться до конца, когда он завершает работу - поток, похоже, возобновляет работу.откуда я отменил при первом запуске: /.Я понятия не имею, почему это так, и это выглядит так, как будто отмененный поток возобновляет и фактически запоминает состояние.Я знаю, что это происходит, потому что на моем графическом интерфейсе у меня есть JLabel, который говорит «элемент обработки 1 из 15 ...», и он возвращается к отмененной точке.
public class Test
{
private SwingWorker<Object, Integer> swingworker = initiate();
private void startListener()
{
start.addActionListener(new ActionListener ()
{
public void actionPerformed(ActionEvent e)
{
runIt();
}
});
}
private void runIt()
{
try
{
if(swingworker .isDone())
swingworker = getSwingWorker();
swingworker.execute();
}
catch (HeadlessException e) { }
catch(Exception e){LogFileWriter.log(e);}
}
private SwingWorker<Object, Integer> getSwingWorker()
{
return new SwingWorker<Object, Integer>()
{
Object o;
protected Object doInBackground() throws Exception
{
//do some short calcs
doLongCalc();
return o;
}
protected void done()
{
if(!swingworker .isCancelled()) {} //chnage the gui values like enable / disable button }
else{}//it was cancelled so stop progress bar and stuff
}
};
}
private void cancelListener()
{
cancel.addActionListener(new ActionListener ()
{
public void actionPerformed(ActionEvent e)
{
if(swingworker.getState() == SwingWorker.StateValue.STARTED || swingworker.getState() == SwingWorker.StateValue.DONE)
{
swingworker .cancel(true);
}
}
});
}
private void doLongCalc()
{
//wrap the taks in checks for cancelled or not
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
if(!swingworker.isCancelled())//do something
}
}