2012-07-04 4 views
0

Я делаю JFrame, который будет загружать изображения из Интернета. У меня это работает, но проблема с этим JFrame заключается в том, что есть много фотографий, и поэтому им требуется довольно много времени для загрузки. Это хорошо, но я хотел бы показать пользователю, что изображения загружаются. По какой-то причине я не могу получить JPanel для отображения в загружаемом JFrame. Я знаю, что это распространенная ошибка, и я пробовал много исправлений, но никто из них не работает. Вот код:JPanel не отображается в JFrame

final JFrame weatherLoadPop=new JFrame("Loading weather..."); 
weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
weatherLoadPop.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     weatherPop.dispose(); 
    }; 
}); 
weatherLoadPop.setResizable(false); 
weatherLoadPop.setBounds(100,50,225,100); 
JPanel weatherLoadPanel=new JPanel(); 
weatherLoadPanel.setBackground(Color.RED); 

weatherLoadPanel.setPreferredSize(new Dimension(225,100)); 
JLabel weatherLoadLabel=new JLabel("Loading...0%"); 
weatherLoadPanel.add(weatherLoadLabel); 
weatherLoadPop.add(weatherLoadPanel); 
weatherLoadPop.pack(); 
weatherLoadPop.validate(); 
weatherLoadPop.setVisible(true); 

Я не уверен, что использую pack() и validate() правильно. Я часто их не использую. В любом случае удаление их не помогает. Самая странная часть этой проблемы, для меня, заключается в том, что JFrame, который загружает изображения, работает красиво, в то время как гораздо более простая загрузка JFrame этого не делает.

Спасибо за любую помощь.

ответ

1

Здесь все работает. Может быть, вы должны предоставить sscce, что мы можем проверить?

я должен был изменить свой слушатель событий распоряжаться weatherLoadPop вместо weatherPop и добавил свой код в тестовый класс:

package test; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String[] args) { 
     final JFrame weatherLoadPop = new JFrame("Loading weather..."); 
     weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     weatherLoadPop.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       weatherLoadPop.dispose(); 
      } 
     ; 
     }); 
     weatherLoadPop.setResizable(false); 
     weatherLoadPop.setBounds(100, 50, 225, 100); 
     JPanel weatherLoadPanel = new JPanel(); 
     weatherLoadPanel.setBackground(Color.RED); 

     weatherLoadPanel.setPreferredSize(new Dimension(225, 100)); 
     JLabel weatherLoadLabel = new JLabel("Loading...0%"); 
     weatherLoadPanel.add(weatherLoadLabel); 
     weatherLoadPop.add(weatherLoadPanel); 
     weatherLoadPop.pack(); 
     weatherLoadPop.validate(); 
     weatherLoadPop.setVisible(true); 
    } 
} 

, и я получаю:

Loading....

с помощью:

java version "1.7.0_04" 
Java(TM) SE Runtime Environment (build 1.7.0_04-b20) 
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) 
+0

Спасибо Qsp. Не совсем уверен, что такое ssce. Я нажал ссылку и прочитал страницу, но не код, который вы предоставили ssce? Я бы выпустил больше кода, но моя программа закрыта. После комментирования остальной функции она сработала. Фактически он ВСЕГДА работал, но JPanel не отображался до тех пор, пока функция, содержащая его, не будет закончена. Я никогда не видел дисплей JPanel, потому что я вызывал dispose() на нем до того, как функция закончилась. Почему он ждет завершения функции перед отображением JPanel и как это исправить? Большое спасибо за помощь, Cameron –

+0

SSCCE - это именно то, что я опубликовал, и что-то, что вы должны сделать сами, чтобы люди быстрее вам помогли (им не придется готовить класс и могут копировать -past и проверить/исправить свой код). –

+0

Посмотрите на этот [отличный ответ] (http://stackoverflow.com/a/9976255/856202) по аналогичной проблеме. Если вы правильно поняли, что ваш качающийся поток замерзает во время выполнения вашей функции. Поэтому вы должны запустить свою функцию внутри нового потока, тем самым предотвращая блокировку отображения JPanel. Если вам нужна дополнительная помощь, пожалуйста, скажите. –