Исполнение в ловушке внутри кнопки - PullRequest
2 голосов
/ 18 мая 2011

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

Как заставить интерфейс освободить доступ к другим кнопкам во время работы этого метода?

//methods inside the button
this.setCrawlingParameters();
webcrawler = MasterCrawler.getInstance();
webcrawler.resumeCrawling(); //<-- the infinite loop method

Ответы [ 2 ]

7 голосов
/ 18 мая 2011

вам нужно использовать SwingWorker

. Способ работы Swing заключается в том, что он имеет один основной поток - поток диспетчеризации событий (EDT), который управляет пользовательским интерфейсом.В документации по Swing вы увидите, что рекомендуется никогда не выполнять долго выполняющиеся задачи в EDT, поскольку, поскольку он управляет пользовательским интерфейсом, если вы делаете что-то сложное в вычислительном отношении, ваш пользовательский интерфейс будет зависать.Это именно то, что вы делаете.

Так что вам нужно, чтобы ваша кнопка вызывала SwingWorker, чтобы сложные вещи выполнялись в другом потоке.Будьте осторожны, чтобы не изменять элементы пользовательского интерфейса из SwingWorker;весь код пользовательского интерфейса должен быть выполнен в EDT.

Если щелкнуть ссылку для SwingWorker, вы увидите следующее:

На событии не должны выполняться трудоемкие задачиОтправка темы.В противном случае приложение перестает отвечать на запросы.Доступ к компонентам Swing возможен только в потоке диспетчеризации событий

, а также ссылки на примеры использования SwingWorker.

3 голосов
/ 18 мая 2011

Создать новую тему:

// In your button:
Runnable runner = new Runnable()
{
    public void run()
    {
         setCrawlingParameters(); // I removed the "this", you can replace with a qualified this
         webcrawler = MasterCrawler.getInstance();
         webcrawler.resumeCrawling(); //<-- the infinite loop method
    }
}
new Thread(runner, "A name for your thread").start();
...