2012-03-29 5 views
1

사용자가 응용 프로그램의 특정 단추를 클릭하면 새 JFrame에로드 이미지를 표시하려고합니다 .JFrame이 표시되지만 아무 것도 표시하지 않으며! 또한 흰색 배경으로 표시되지만 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에 icon1이 추가되지 않습니다. – vaisakh

+0

죄송합니다. 관련 코드를 붙여 넣었습니다. 실수로 해당 행을 무시했습니다. – nikel

+0

이것은 귀하의 질문에 대한 답변이 아니지만, 당신이 pack()과 setSize()를 호출하고 있음을 확인합니다. 두 가지 방법 모두를 부르는 것은 부적절합니다. pack() 또는 setSize() 중 하나만 호출하고 둘 다 호출하지는 마십시오. pack() 메소드는 내용을 기준으로 크기를 설정합니다. 드문 경우지만 내용의 크기를 결정할 수 없으며,이 경우 pack()에 대한 호출을 제거하고 setSize()를 명시 적으로 호출합니다. – Michael

답변

4

시간이 많이 걸리는 부분을 이벤트 처리기 나 이벤트 발송 스레드에서 실행중인 메서드에 넣지 마십시오. 대신 swing worker을 사용할 수도 있습니다.

+0

여기에 무슨 일이 일어나는지 말해 줄 수 있겠습니까? JFrame은 CPU 집약적 인 작업 전에 그려 지므로 표시해야합니다. – nikel

+2

@nikel 불행히도 이벤트 발송은 매우 복잡한 작업입니다. 코드가 "보이는 것처럼 보이지만"메서드가 올바른 순서로되어 있어도 프레임 그리기 및 실행 작업은 매우 다른 방식으로 수행됩니다. 'setVisible' 또는 다른 메소드는 그 자체로 이벤트를 생성하고 이벤트 큐에 대기열에 넣습니다. 하나의 이벤트 (이 경우에는 액션 리스너 처리)가 완료된 후에 만 ​​다음 이벤트가 시작됩니다. 즉, JFrame은 CPU 집약적 인 작업 이전에는 그려지지 않았지만 그 이후에는 그려지지 않았습니다. SwingWorker '에 대해서는 – Howard

+0

+1입니다. 관련 [예제] (http://stackoverflow.com/a/4530659/230513)도 참조하십시오. – trashgod

1

UI 스레드를 절대로 공개하지 않으므로 JFrame이 페인트되지 않습니다. 모든 그래픽 작업은 UI 스레드에서 수행되므로 jframe에서 아무 것도 표시하지 않으려면 프레임을 닫고 계산을 수행 한 다음 프레임을 닫아야합니다.

+0

좀 더 정교해질 수 있겠습니까? – nikel

관련 문제