Почему набор Java Swing занимает так много времени? - PullRequest
3 голосов
/ 18 июля 2011

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

К сожалению, эффект, который я вижу, заключается в том, что загружаемые ярлыки (скажем, 100 ярлыков) выглядят так, как будто они размещаются по одному за раз. Хотя это случается в течение секунды, я бы предпочел, чтобы сначала была ВСЕ НАГРУЗКА, а затем просто надевался сразу.

Я всегда думал, что когда вы добавляете компонент, все уже сделано, и setVisible (true / false) просто включает и выключает видимость. Но из-за этой проблемы я вижу, что, возможно, это не совсем так.

Вот мой основной метод (я могу предоставить больше кода при необходимости):

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                JFrame window = new JFrame();
                window.setBounds(100, 100, 450, 300);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                window.getContentPane().setLayout(new BorderLayout());
                JobInfoPanel jobInfoPanel = new JobInfoPanel();
                window.getContentPane().add(jobInfoPanel,
                        BorderLayout.CENTER);
                window.pack();
                window.setVisible(true);        
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

Что подтверждает мне, что проблема заключается в setVisible, если я добавлю следующий код после window.setVisible (true); возникает та же проблема:

jobInfoPanel.setPanelListVisible(false);
jobInfoPanel.setPanelListVisible(true);

Я перепробовал много вещей, но ничего не работает, включая размещение "jobInfoPanel.setPanelListVisible (false);" перед window.setVisible (true). То же самое происходит.

Единственное решение, которое, я думаю, у меня осталось, это как-то нарисовать эту панель за кадром, а затем быстро переместить ее в правильное место ... если это имеет смысл (я читал это как предложение на некоторых страницах, но эта конкретная проблема поднималась не часто).

Есть ли более простой способ сделать то, что мне нужно?

Любая помощь очень ценится, спасибо.

-Asaf

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Панель, которая загружает метки в потоке, информация которого взято из столбца таблицы базы данных

Это работа для JTable . Вы можете найти пример здесь . Таким образом, вы можете сократить время, необходимое для рисования тонн JLabels .

0 голосов
/ 19 июля 2011

Я ценю ответ каждого, но смог решить проблему, создав отдельный метод, который инициализировал эту панель и вызвал ее ПОСЛЕ пакета () в основном методе, например:

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                JFrame window = new JFrame();
                window.setBounds(100, 100, 450, 300);
                window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                window.getContentPane().setLayout(new BorderLayout());
                JobInfoPanel jobInfoPanel = new JobInfoPanel();
                window.getContentPane().add(jobInfoPanel,
                        BorderLayout.CENTER);
                window.pack();
                jobInfoPanel.createDriverListPanel();                   
                window.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

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

Еще раз спасибо, -Asaf

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