2012-03-29 2 views
1

Я пытаюсь отобразить Загрузка изображения в новом JFrame, когда пользователь нажимает на определенную кнопку в моем приложении. Отображается JFrame, но ничего не отображается !, также с фоном WHITE, тогда как все JFrames имеют серый фон по умолчанию. Что здесь не так?Jframe Содержание не отображается

stop.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      analyzer.running=false; 
      JFrame Load1=new JFrame("Load1"); 
      ImageIcon icon1=new ImageIcon("./ajax-loader.gif"); 
      System.out.println(icon1.getIconHeight()); 
      Load1.add(new JLabel("Retrieving...", icon1, JLabel.CENTER),BorderLayout.CENTER); 
      Load1.pack(); 
      Load1.setSize(400,400); 
      Load1.setVisible(true); 

      System.out.println("Start Processing"); 
      parser.parse(); // Time Consuming method 


      nw_Creator.create(); 
      System.out.println("End Processing"); 
      Load1.setVisible(false); 

      home.setVisible(false); 
      screen2.setVisible(true); 

     } 
    }); 
+0

Я не вижу значка, добавляемого в JFrame в вопросе? – vaisakh

+0

Извините за это, я просто вставил соответствующий код. Исправлена ​​эта строка по ошибке. – nikel

+0

Это не ответ на ваш вопрос, но я замечаю, что вы вызываете как pack(), так и setSize(). Вызов обоих этих методов неуместен. Вызовите либо pack(), либо setSize(), но не оба. Метод pack() будет устанавливать размер на основе содержимого. Редкие случаи, когда размер содержимого не может быть определен, в этом случае вы удаляете вызов pack() и вызываете setSize() явно. – Michael

ответ

4

Не размещайте трудоемкие детали в обработчике событий или любом методе, выполняющемся в потоке отправки событий. Вместо этого вы можете использовать swing worker.

+0

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

+2

@nikel К сожалению, диспетчеризация событий - довольно сложная задача. Хотя ваш код «выглядит правильно» и методы находятся в правильном порядке, обработка рисунка кадра и действий по обстрелу выполняется совсем по-другому. Такие методы, как 'setVisible' или другие, сами создают события и ставят их в очередь событий. Только после того, как одно событие (в этом случае обработка обработчика действий) будет завершено, следующий будет запущен. Короче говоря, JFrame * не * рисуется перед задачей интенсивного процессора, но потом. – Howard

+0

+1 для 'SwingWorker'. См. Также этот пример [пример] (http://stackoverflow.com/a/4530659/230513). – trashgod

1

Что происходит, так это то, что вы никогда не выпускаете нить пользовательского интерфейса, поэтому ваш JFrame никогда не будет нарисован. Поскольку все графические операции выполняются в потоке пользовательского интерфейса, вы должны освободить его, выполнить свои вычисления, а затем закрыть кадр, если вы хотите, чтобы jframe отображал что-либо.

+0

Не могли бы вы быть более сложными? – nikel

Смежные вопросы