Как я могу нажать обновление выбранной вкладки (Java качели)? - PullRequest
0 голосов
/ 24 октября 2011

Я пытаюсь обновить отображаемую вкладку, однако кажется, что она подождет до конца метода, а затем обновится. Можно ли сделать так, чтобы отображаемая вкладка обновлялась немедленно?

Вот пример кода, где у меня есть эта проблема:

private static void someButtonMethod() 
{
    Button = new JButton("My Button");
    Button(new ActionListener() {
        public void actionPerformed(ActionEvent e) 
        {
            tabs.setSelectedIndex(1);

            // Do some other things (In my case run a program that takes several seconds to run).
            runProgram();
        }
    });
}

1 Ответ

6 голосов
/ 24 октября 2011

Причина этого заключается в том, что метод выполняется в потоке диспетчеризации событий, и любые операции перерисовки также будут выполняться в этом потоке .Одним из «решений» является обновление индекса вкладки, а затем планирование оставшейся работы для последующего вызова в EDT;это должно привести к немедленному обновлению состояния вкладки;например,

public void actionPerformed(ActionEvent evt) {
  tab.setSelectedIndex(1);

  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      // Do remaining work.
    }
  });
}

РЕДАКТИРОВАТЬ

В приведенном ниже комментариях пример вызова SwingWorker для вызова метода runProgram будет выглядеть примерно так:

// Typed using Void because runProgram() has no return value.
new SwingWorker<Void, Void>() {
  protectedVoid doInBackground() {
    runProgram();
    return null; // runProgram() doesn't return anything so return null.
  }

  protected void done() {
    // Called on the EDT when the background computation has completed.
    // Could insert code to update UI here.
  }  
}.execute()

Однако я чувствую здесь большую проблему: тот факт, что вы видите значительную задержку в обновлении вкладки, заставляет меня думать, что вы выполняете долгосрочные вычисления на EDT.Если это так, вы должны рассмотреть возможность выполнения этой работы в фоновом потоке.Взгляните на класс SwingWorker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...