2016-08-15 3 views
-1

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

confirm.addActionListener(new ActionListener() 
    { 
     ArrayList<String> newZones = new ArrayList<String>(); 
     public void actionPerformed(ActionEvent e) 
     { 
      JFrame loadingFrame = new JFrame(); 
      JPanel loadingPanel = new JPanel(); 

      loadingFrame.setSize(500, 500); 
      JLabel loadingL = new JLabel(new ImageIcon("C:/Users/gria/Desktop/Images/Loading.png")); 
      loadingPanel.add(loadingL); 
      loadingFrame.add(loadingPanel); 

      loadingFrame.validate(); 
      loadingFrame.repaint(); 
      loadingFrame.pack(); 

      loadingFrame.setVisible(true); 

// The Image will not show until this function finishes which is where all the data base connections take place. 
       Console.SetZones(newZones); 
     } 
    }); 
+3

1) Возможно, потому что после первого раза он никогда не выполняет код внутри 'if (LFrameCreated == false) 'больше, поэтому он не обновляет изображение. 2) Проводка [MCVE] увеличит ваши шансы получить хороший ответ. 3) Кажется, что в вашем коде есть ненужное чрезмерное использование статического кода. 4) Имена переменных и методов должны начинаться с буквы нижнего регистра (соглашение о кодировании). –

+0

1) если я вынимаю if и удаляю рамку, он по-прежнему дает ту же проблему, где отображается рамка, но не изображение. Если я не удаляю фрейм и не вынимаю, если он покажет изображение после загрузки всех данных. 2) Почти каждый раз, когда я отправляю сюда, я всегда запрашиваю больше кода T_T – Ardel

+1

2) Я на самом деле запрашиваю код * меньше *. [MCVE] должен сузить ваш код на один * компилируемый * пример, который содержит только действительно необходимые строки для воспроизведения проблемы. (Пожалуйста, действительно прочитайте страницу, с которой я связан) –

ответ

2

Изображение не будет отображаться до выполнения этой функции отделки в котором происходят все соединения базы данных.

Swing - однопоточный, что означает вызов любой задачи, которая может занять значительное количество времени, чтобы Swing не выполнял свои обычные задачи (покраска, отправка событий и т. Д.) До тех пор, пока эта задача не завершится. Ваш код вызывает следующее:

// The Image will not show until this function finishes which is where all the data base connections take place. 
Console.SetZones(newZones); 

... изнутри ActionListener реализации, что означает, что она вызывается на событие диспетчерского Thread (EDT). Чтобы этого избежать, вызовите этот метод в новом Thread или используйте SwingWorker. В любом случае, убедитесь, что любые вызовы Swing из другого потока отправляются в EDT с использованием SwingUtilities.invoke* или при использовании SwingWorker его методы

0

Лукас Роттер опубликовал правильный ответ в своем комментарии. Проблема, как представляется, с

(LFrameCreated == false)

+0

Вынимая его, удаляя рамку и воссоздавая ее, возникает та же проблема. – Ardel

2

Чтобы изображение было загружено перед выполнением кода базы данных, вызовите Console.SetZones(newZones); внутри EventQueue.invokeLater():

EventQueue.invokeLa‌​ter(() -> Console.SetZones(new‌​Zones)) 
Смежные вопросы