Свинг обновления компонентов пользовательского интерфейса во время выполнения задания - PullRequest
1 голос
/ 14 марта 2012

Я разрабатываю свинговое приложение.В этом у меня есть рабочий процесс заданий, которые необходимо выполнить.

Я запускаю эти задания в цикле for один за другим.Интересно, что мне нужно обновить строку состояния графического интерфейса с текущим именем задания.

Я не могу использовать SwingUtilities.invokeAndWait, так как он не может работать в потоке диспетчеризации, который будет текущим запущенным потоком.

Я пытался использовать SwingWorker, так как задания выполняются в цикле, будет выполнен метод doBackGrount () SwingWorker, который выйдет и получит следующий индекс для запуска следующего задания.В done () SwingWorker я написал код для обновления GUI со статусом.

public class TestAction extends SwingWorker<Boolean, Void> {

    boolean executeThread = false;

    public TestAction() {
    }

    @Override
    protected Boolean doInBackground() throws Exception {
        executeThread = ExecuteWebServiceAction.webServiceExecution();
        return executeThread;
    }

    @Override
    protected void done() {
        try {
            boolean isOver = (boolean) get();
            if (isOver) {
                MainApplication.getInstance().getFrame().setStatus(LangUtil.getString("cdsExecuteFinehed")
                        + " " + ((WebServiceTool) DrawingManager.getInstance().getCurrentTool()).getName());
                FrameMain.jPanel6.repaint();
            }
        } catch (Interr`enter code here`uptedException ex) {
            Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ExecutionException ex) {
            Logger.getLogger(TestAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

И вот где я вызываю TestAction:

if (!WorkFlow.isIsWorkflow()) {
    SwingUtilities.invokeLater(
      new Runnable() {
        @Override
        public void run() {
          webServiceExecution();
        }
    });
} else {
     new TestAction().execute();
}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

работает в цикле один за другим и уведомляет пользовательский интерфейс, когда это делается

звучит как "большая работа с промежуточными результатами". Промежуточные результаты поддерживаются с помощью методов публикации / обработки:

  • реализует doInBackground для циклического выполнения заданий и вызова публикации, когда один завершается
  • реализовать процесс обновления пользовательского интерфейса
0 голосов
/ 14 марта 2012

Вы можете добавить Runnable в ваш конструктор, который будет запускаться, когда done () закончится:

public class TestAction extends SwingWorker<Boolean, Void> {

    boolean executeThread = false;
    private final Runnable runWhenDone;

    public TestAction(Runnable runWhenDone) {
        this.runWhenDone = runWhenDone;
    }

    //...

    @Override
    protected void done() {
    try {
        boolean isOver = (boolean) get();
        if (isOver) {
            MainApplication.getInstance().getFrame().setStatus(LangUtil.getString("cdsExecuteFinehed")
                + " " + ((WebServiceTool) DrawingManager.getInstance().getCurrentTool()).getName());

            //Run the Runnable here
            runWhenDone.run();

            //...

А в вашем классе GUI

Runnable r = new Runnable() {public void run() {updateTheTitle();}};
(new TestAction(r)).execute();
private void updateTheTitle() { yourTitle.setText("I am done");}
0 голосов
/ 14 марта 2012

вы можете использовать Thread.currentThread (). Sleep (5000);в методе doInBackground SwingWorker, прежде чем currentthread завершит свое выполнение и обновит ваш пользовательский интерфейс

...