2012-01-14 4 views
0

Я знаю, что это своего рода неопределенный вопрос, но я постараюсь сделать его максимально ясным. Когда Java-приложение запускается в первый раз, он проверяет, существуют ли файлы и каталоги и проверяет подключение к Интернету.Как предварительно загрузить компоненты Swing

Приложение затем позволяет пользователю перейти к панели управления, что требует загрузки и добавления многих компонентов Swing на панель фона. Это требует времени.

Мне было интересно, как я мог это сделать, чтобы при загрузке в начале приложение загрузило все компоненты Swing Images и т. Д., Чтобы они отображались мгновенно, когда пользователь выполняет команду для этого.

я могу загрузить все компоненты, как это:

JButton = new JButton("blah"); 

, но я не уверен, что это достаточно, чтобы сделать компоненты появляются мгновенно, не добавив несколько изображений заполнены компонентов Swing, в то же время по-прежнему lag поток пользовательского интерфейса, даже если он уже «загружен», как видно выше?

Спасибо!

ответ

-1

на компонентах использовать

setVisible(false) 

, например

public class myParentPanel extends JPanel{ 
    public myParentPanel{ 

    //add all the child components 
    //Do what ever takes along time 
    setVisible(false); //this then makes in invisible but still 
         //allows all the set up code to run 
    } 

    public void showParent(){ 
     setVisible(true); 
     invalidate(); 
    } 
} 

, а затем создать метод, чтобы сделать их видимыми, когда это требуется. Таким образом, все ваши настройки в конструкторах ч назвать тогда, когда вы называете метод сказать:

drawWindow() 

тогда только должно вызывать SetVisible (истина) и аннулируют экран назвать свои методы рисования :).

Продвижение по этому вопросу будет состоять в том, чтобы: * запустил ваши настройки, выполнив проверку и загрузку методов панелей в отдельных потоках *, поэтому вам не нужно ждать последовательной загрузки. Поэтому при вашей загрузке вы можете использовать анонимный класс

SwingUtilities.invokeLater(new Runnable(){ public void run(){ 

    //do my display set up 

}}); 
+5

Если вы собираетесь использовать отдельные потоки, не забывайте, что компоненты Swing не являются потокобезопасными. Вам нужно будет использовать 'SwingUtilities.invokeLater' или' invokeAndWait' для выполнения любых обновлений дерева компонентов. –

+0

Дело в том, что у меня уже есть компоненты на экране загрузки, поэтому прямо сейчас я должен удалить компоненты из центральной панели и добавить новые, если бы я добавил компоненты для экрана загрузки, а также компоненты на панель инструментов даже если установлено на невидимое, что бесполезно обрабатывать компоненты, которые видны? –

+0

Хорошая точка Кэмерон приветствует добавление, что полностью забыл: s. Epic - это зависит от типа макета, который вы используете в родительском контейнере. Если вы используете макет по умолчанию, то да, но попробуйте использовать абсолютный макет, и это должно означать, что пространства компонентов должны быть пустыми и каждая вещь размещена там, где вы хотите. (Если вы хотите, чтобы размер был согласованным по размеру, вам нужно чтобы сделать позиции относительно друг друга) –