2010-03-27 6 views
2

이것을 실행하면 JLabel이 보이지 않지만 마우스로 크기를 조정하면 JLabel이 표시됩니다. 왜?자바 JFrame이 매우 이상하다

import javax.swing.*; 
import java.awt.*; 

public class FrmTaoLogin extends JFrame { 

    private JPanel pnlLeft = new JPanel(); 

    public FrmTaoLogin() { 

    super(); 

    pnlLeft.setBorder(BorderFactory.createEtchedBorder()); 
    pnlLeft.add(new JLabel("test1")); 
    getContentPane().add(pnlLeft,BorderLayout.SOUTH); 

    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setSize(200, 200); 

    } 

    public static void main(String[] args) { 

    FrmTaoLogin FrmLogin = new FrmTaoLogin(); 
    FrmLogin.setVisible(true); 

    } 

} 
+1

나를 위해, 당신의 예제를 잘 작동합니다. Windows 7 64bit에서 Java 1.6.0_17 – Midhat

+2

JFrame을 하위 클래스로 추가하면 구성 요소를 추가하는 것이 좋습니다. – kdgregory

+0

그것은 나에게도 잘 돌아갔다. 그래서 나는 스레딩 문제로 의심된다. –

답변

0

이 새로운 OS에 이전의 자바 가상 머신에서 L & F 버그의 일부처럼 보인다. 예를 들어 Windows 7의 경우 가장 먼저 해결 된 문제는 1.6.0_17입니다. 콘솔로 프로그램을 시작해야합니다. 이벤트 스택에 스택 트레이스가 있으면 L & F 버그입니다.

+0

고맙습니다. 문제가 해결되었습니다. Windows 테마를 변경하고 잘 작동합니다. Windows Aero와 NVIDIA GeForce FX5500 문제라고 생각합니다. 이 카드 담당자가 Windows Aero와 함께 작동하지 않습니다. – rodion

3

IIRC 이것은 Frame.pack()을 호출하지 않을 때 발생합니다. 'pack()'을 생성자의 마지막 줄로 호출하면 작동합니다.

+0

사실,'setSize()'는'pack()'프레임을 강제로 제거해야합니다. –

+1

'setSize()'는 프레임의 크기를 알려줍니다. 당신은'invalidate()'를 호출하여 컴포넌트를 다시 계산할 필요가있다. 그러나 프레임 구조의 마지막 단계로'pack()'을 호출하는 것이 더 좋은 습관이다. – kdgregory

+0

나는 그것을 되돌려 준다.'setSize()'는 직접'pack()'을 호출하지 않는다. 그러나, OP의 코드는'pack()'에 대한 호출을 추가하지 않고 첫 번째 시도에서 저에게 효과적이었습니다. 'setSize()'다음에'pack()'호출을 추가하는 것은 주어진 크기 설정을 덮어 쓰는 바람직하지 않은 효과를 실제로 가지고있어서 OP가 원했던 200x200보다 작게 만듭니다. –

1

여기서 문제는 Swing thread 외부의 GUI 구성 요소를 빌드하고 표시하는 것과 관련이 있다고 생각됩니다.

main()을 변경하여 스윙 스레드에서 GUI 코드를 호출하면 어떻게됩니까?

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      FrmTaoLogin FrmLogin = new FrmTaoLogin(); 
      FrmLogin.setVisible(true); 
     } 
    }); 
} 
+0

with invokeLater 동일한 효과가 있습니다. ( – rodion

+0

스윙 스레드에 모든 것을 넣은 후에도 여전히 동일한 문제가 발생하면 JPanel에 구성 요소를 넣고 JPanel을 최상위 컨테이너의 내용 창으로 설정하는 대신 @kdgregory가 위의 주석에서 제안 된대로 최상위 컨테이너에 직접. –

+0

고맙습니다.하지만 먼저 시도하고있는 것은 무엇입니까 :) – rodion

0

모두에게 문제가 해결되었습니다. Windows 테마를 변경하고 잘 작동합니다. Windows Aero와 NVIDIA GeForce FX5500 문제라고 생각합니다. 이 카드 담당자가 Windows Aero와 함께 작동하지 않습니다.

관련 문제