2014-05-21 2 views
0

다음 코드는 UI를 업데이트하기위한 코드입니다. 하지만 첫 번째 줄을 디버깅 할 때 프레임이 실행되지 않아도 즉시 업데이트되지 않습니다. 그리고 그 코드 다음에 오랜 시간 계산을하면 더 이상 바뀌지 않고 프레임을 닫을 수 없습니다.Java : 새 구성 요소는 언제 화면에 표시됩니까?

frame.getContentPane().add(gamePanel); 
((JPanel)frame.getContentPane()).revalidate(); 
frame.repaint(); 

제 질문은 정확히 프레임의 일부 변경 사항이 표시되는 것입니까?

답변

2

"this.setVisible (true);"

+0

미안하지만 나는 그렇게 생각하지 않습니다. 이 간단한 코드를 실행하면'JFrame frame = new JFrame ("Key test"); \t \t MyDrawPanel1 dp1 = new MyDrawPanel1 (frame); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); \t \t frame.setVisible (true); \t \t JPanel p = 새 JPanel(); \t \t p.setLayout (new BorderLayout()); \t \t p.add (dp1, BorderLayout.CENTER); \t \t frame.getContentPane(). add (p); \t \t frame.pack();'프레임에 p를 추가하면 윈도우를 최소화하여 표시 할 수 있습니다. – Tony

+0

변경 사항이 즉시 적용됩니다. 지정된 동작이 수행 될 때 프레임을 업데이트 할 키/액션 리스너에서 특정 시간에이를 표시합니다. – James

0

다음 코드는 UI를 업데이트하기위한 것입니다.

프레임을 처음 표시 할 것인지 또는 현재 표시된 프레임의 구성 요소를 업데이트 할 것인지 알 수 없습니다. 당신은 단지 눈에 보이는 프레임을 만들려고 노력하는 경우

는 기본 코드는 다음과 같습니다

frame.add(...) 
frame.pack(); 
frame.setVisible(true); 

당신이 볼 프레임에 구성 요소를 추가하려는 경우 다음 기본 코드는 다음과 같습니다

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

내가 그 코드 뒤에 약간 긴 시간 계산을하고 있다면 찾을 ...

Event Dispatch Thread (EDT)을 차단하는 코드가 없으면 GUI가 다시 칠하지 못하게하지 않는 한 패널이 즉시 다시 칠해집니다.

그리고 그 코드 뒤에 약간 긴 시간 계산을하고 만약 내가 찾을 수는

이것은 당신이 EDT를 차단 나타냅니다. 장기 실행 태스크에 대해 별도의 스레드를 작성해야합니다. 자세한 내용은 Concurrency in Swing에있는 스윙 튜토리얼의 섹션을 읽어보십시오. 자습서에서 설명한대로 SwingWorker을 사용할 수 있습니다.

관련 문제