2014-10-31 4 views
1

렌더링 용 JLatexMath 및 부저 용 jinput을 비롯한 제 학생을위한 MathQuiz를 작성하고 있습니다. 문제는 프로그램을 시작할 때 (매 4 번째와 같이) 때로는 구성 요소가 보이지 않는다는 것입니다. JFrame의 크기를 조정 한 후에 나타납니다. 우선은 jinput 또는 jlatexMath 라이브러리의 버그 생각했지만, 난이 최소한의 코드와 같은 오류를받을 수 있나요 : 코드로 잘못 무엇Java 레이아웃에 구성 요소가 표시되지 않습니다. (가끔)

public class Shell extends JFrame{ 

    private JButton button1; 
    private JButton button2; 
    private Formula formula; 

    public Shell() { 
    super("blaBla"); 
    this.setSize(800, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); 
    Box b = Box.createHorizontalBox(); 
    button1 = new JButton(" "); 
    button1.setEnabled(false); 
    b.add(button1); 
    b.add(Box.createHorizontalGlue()); 
    button2 = new JButton(" "); 
    button2.setEnabled(false); 
    b.add(button2); 
    add(b); 
    JPanel formulaPanel = new JPanel(); 
    add(Box.createVerticalStrut(20)); 
    add(formulaPanel); 
    } 

    public static void main(String[] args) { 
    Shell s = new Shell(); 
    } 
} 

?

+0

글쎄, 스윙에 이상한 문제가 있다면, 문서를주의 깊게 읽고 모든 [Swing code is Event Dispatch Threa d.] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html) 시작하십시오. – markspace

+0

Ok, 빠른 대답을위한 thx. 추가 할 때 System.out.println (javax.swing.SwingUtilities.isEventDispatchThread()); 생성자에 내가 콘솔에 거짓 가져옵니다. Thread를 EventDispatchThread로 만들려면 어떻게해야합니까? – user3648884

+0

내가 준 링크의 왼쪽에 여러 링크가 있습니다. 모든 문서를 읽는 것이 가장 좋습니다. 그렇지 않으면 무엇을 놓쳤는 지 압니까. [이 링크를 사용해보십시오] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) Java의 동시성에 대한 전체 절을 읽어야합니다. 적어도. (새의 Runnable() { \t \t 공공 무효 실행() { \t \t 새로운 SwingUtilities.invokeLater을 : – markspace

답변

3

setVisible(true);을 생성자의 끝으로 이동하여 시작하십시오. 대신 여기에 있었다의

...

public Shell() { 
    super("blaBla"); 
    this.setSize(800, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    //... 
} 

이동 여기 ...

public Shell() { 
    super("blaBla"); 
    //... 
    add(Box.createVerticalStrut(20)); 
    add(formulaPanel); 
    setVisible(true); 
} 

는 다른 가능한 그래픽 결함을 방지하기 위해, 당신은 항상 이벤트 내에서 당신의 UI가 시작됩니다 Dispatching Thread, 자세한 내용은 Initial Threads을 참조하십시오.

+0

생성자의 끝에 setVisible 지금까지 잘 작동하는 것 같다. 도움 주셔서 감사합니다. :-) – user3648884