Потоки графического интерфейса Java - SwingWorker - PullRequest
1 голос
/ 01 июля 2010

У меня вопрос по SwingWorker и Java GUI.

У меня есть несколько классов, которые обрабатывают информацию, мы можем назвать их Foo1, Foo2 и Foo3. Эта обработка может занять очень много времени.

Это все подклассы Foo, однако Foo не вызывается непосредственно сам по себе (классы Foo[x] используют методы, унаследованные от Foo. Чтобы EDT был свободен для рисования индикатора выполнения, лучший способ использовать SwingWorker при сохранении моей иерархии объектов? Возможно ли иметь классы-оболочки, такие как Foo1Worker extends SwingWorker, и иметь doInBackground() call Foo1.myProcessMethod()? Даже если Foo1 не расширяет SwingWorker, будет это все еще работает, как я ожидаю?

edit: чтобы уточнить мой вопрос, как я могу сделать Foo[x] SwingWorkers, даже если они уже подклассы?

Ответы [ 2 ]

2 голосов
/ 01 июля 2010

Я думаю, что ответ критически зависит от типа данных, управляемых подклассами Foo.Если результаты однородны, просто расширьте SwingWorker и создайте соответствующие экземпляры конкретных подклассов:

class Whatever {}

abstract class AbstractFoo extends SwingWorker<List<Whatever>, Whatever> {}

class Foo1 extends AbstractFoo {

    @Override
    protected List<Whatever> doInBackground() throws Exception {
        ...
    }
}

Если каждый из них управляет различным типом, сделайте родительский универсальный тип и создайте каждый конкретный подкласс с необходимым типом:

class Whatever {}
class Whichever {}

abstract class GenericAbstractFoo<T, V> extends SwingWorker<T, V> {}

class Foo2 extends GenericAbstractFoo<List<Whatever>, Whatever> {

    @Override
    protected List<Whatever> doInBackground() throws Exception {
        ...
    }
}

class Foo3 extends GenericAbstractFoo<List<Whichever>, Whichever> {

    @Override
    protected List<Whichever> doInBackground() throws Exception {
        ...
    }
}
0 голосов
/ 01 июля 2010

Вам потребуется SwingWorker, если вам нужно обновить элементы графического интерфейса, например, процедуры вызова, такие как SetText(). Я никогда не думал об их использовании для задач обновления без графического интерфейса; Я всегда подклассифицировал Thread или реализовал Runnable. Я рекомендую вам попробовать это с вашими классами Foo и посмотреть, решит ли проблема себя.

...