2013-02-12 2 views
1

JFrame에 컴퓨터를 실행하는 컴퓨터에 대한 정보 (HOSTIP)가 표시되고 다른 정보를 표시하기 위해 JDBC 연결을 만드는 프로그램을 작성했습니다.JFrame에서 지연된 디스플레이

main 기능 만이 두 줄을 한

다음 nf JFrame에 표시하는

NewFrame nf = new NewFrame(); //Here I make all the needed calculations 
nf.setVisible(true); 

(은 NEWFRAME이 JFrame의를 확장) 내가 필요한 모든 계산을 수행 생성자에서

을하고 설정 . 나는 단지를 건설 한 후 볼 수 있도록 설정할 수 있지만,이, 정보 가득하기 전에

내가 프로그램을 실행

, 나는 0.5초의 JFrame국경를 참조하십시오.

내가 약 에 대한 참조 것입니다 둘째 :

before

(내부는 내 바탕 화면 배경입니다) 그리고 나는 정보를 참조하십시오

after

왜 이것은 생성자에서 모든 계산을 수행하지만 발생합니까?

+2

여기에 코드를 게시하십시오. 분명히 거기에 뭔가 잘못입니다. – StanislavL

+0

약 500 줄의 코드입니다.이 문제를 일으킬 수있는'JFrame '에 데이터를 할당 할 때 특정 부분이 있습니까? – Maroun

답변

1

내부에서 스윙 구성 요소와 상호 작용해야

당신은 Concurrency in Swing보고 중요한 규칙 아마 Swing Worker

한 스윙과 스레드 처리 걸릴 것 같아서, 당신처럼 보이는 GUI 스레드에서 일부 호출, 즉 데이터베이스 쿼리를 동 기적으로 수행하십시오. SwingWorker을 사용하여 비동기로 수행해야합니다.

final JTextField field = new JTextField(); 
field.setEditable (false); 

JButton button = new JButton(new AbstractAction ("Calculate!") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     field.setText ("Calculating..."); 

     new SwingWorker<String, String>() 
     { 
      @Override 
      protected String doInBackground() throws Exception { 
       Thread.sleep(3000L); 

       field.setText ("Calculated!"); 

       return null; 
      } 
     }.execute(); 
    } 
}); 

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().setLayout (new BorderLayout()); 
frame.getContentPane().add (button, BorderLayout.NORTH); 
frame.getContentPane().add (field, BorderLayout.CENTER); 
frame.pack(); 
frame.setVisible (true); 
+3

-1 doInBackground의 필드에 접근하기위한 것 (일명 : EDT로부터) – kleopatra

+0

@kleopatra 메소드'setText'는 스레드로부터 안전합니다. –

+0

아니요, 아닙니다. 이전 버전에서와 같이 (사실은 설명서 버그라고 읽었습니다!) 문서화되었지만 절대로 없었습니다. – kleopatra

5

하면 이벤트 디스패치 스레드 (EDT)

을 차단하는 것처럼 당신은 차단하거나 시간 EDT에 걸린다 수있는 작업을 실행하지 않도록해야 소리. 이렇게하면 EDT가 일종의 중요한 재 페인트 이벤트를 발송하지 못하게됩니다. 당신은 단지 EDT