2012-01-07 3 views
16

프레임에 2 개의 JPanels가 있습니다. 첫 번째 패널에는 버튼 등의 자바 항목이 포함되어 있습니다. 추가 한 두 개의 버튼이 나타나지만 Jscinner는 창 크기를 조정 한 직후에 나타납니다. 나는 이것이 내가 추가 할 다른 항목들에서도 일어날 것이라고 생각한다. 이 문제를 어떻게 해결할 수 있습니까?자바 항목은 창 크기가 조정 된 후에 만 ​​표시됩니다.

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerListModel; 
import javax.swing.SpinnerNumberModel; 

public class StartingPoint { 

static JFrame window; 
static DrawingArea draw; 
static JButton b1, b2; 
static JPanel userInt; 
static JSpinner gravitySpinner; 

public static void main(String[] args) { 
    window = new JFrame("Ball"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setSize(600, 400); 
    window.setLayout(new BorderLayout()); 
    window.setVisible(true); 

    draw = new DrawingArea(); 
    window.add(draw, BorderLayout.CENTER); 

    userInt = new JPanel(); 
    window.add(userInt, BorderLayout.NORTH); 

    b1 = new JButton("Start"); 
    b2 = new JButton("aaa"); 
    b1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      draw.setUp(); 
     } 
    }); 
    userInt.add(b1); 
    userInt.add(b2); 


    SpinnerNumberModel gravityModel = new SpinnerNumberModel(.9, .1, 2, .1); 
    gravitySpinner = new JSpinner(gravityModel); 
    userInt.add(gravitySpinner); 
} 
} 

답변

29

당신은 JFrame의에 setVisible(true)를 호출 후 GUI 에 구성 요소를 추가하는 무엇이든이 추가되기 전에 사용자가 GUI를 렌더링하고 있기 때문에 그 뒤로, 그리고 그래서 일이 '나중에 추가 이겼다 의미가 있습니다 모든 것이 다시 그리기 될 때까지 표시되지 않습니다.

먼저 모든 구성 요소를 추가하고 다음 만 JFrame에서 setVisible(true)을 호출하여 GUI를 렌더링합니다.

편집 또한
, 당신은 아무것도에 setSize(...)를 호출하지 않도록 대신 구성 요소 자체가 자신의 preferredSizes을 사용하고 setVisible(true)로 표시하기 전에 JFrame의에 pack()를 호출하여 크기를 수 있도록 할 것입니다.

편집 예를 들어 2
:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.SwingUtilities; 

public class StartingPoint { 

    private DrawingArea draw; 
    private JButton b1, b2; 
    private JPanel userInt; 
    private JSpinner gravitySpinner; 

    private JPanel mainPanel = new JPanel(); 

    public StartingPoint() { 
     mainPanel.setLayout(new BorderLayout()); 
     draw = new DrawingArea(); 
     mainPanel.add(draw, BorderLayout.CENTER); 

     userInt = new JPanel(); 
     mainPanel.add(userInt, BorderLayout.NORTH); 

     b1 = new JButton("Start"); 
     b2 = new JButton("aaa"); 
     b1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      draw.setUp(); 
     } 
     }); 
     userInt.add(b1); 
     userInt.add(b2); 

     SpinnerNumberModel gravityModel = new SpinnerNumberModel(.9, .1, 2, .1); 
     gravitySpinner = new JSpinner(gravityModel); 
     userInt.add(gravitySpinner); 
    } 

    public JPanel getMainPanel() { 
     return mainPanel; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame window = new JFrame("Ball"); 
      window.add(new StartingPoint().getMainPanel()); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      window.pack(); 
      window.setLocationRelativeTo(null); 
      window.setVisible(true); 
     } 
     }); 
    } 
} 

class DrawingArea extends JPanel { 

    private static final int PREF_W = 600; 
    private static final int PREF_H = 400; 

    public void setUp() { 
     // TODO finish 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

} 
+2

그리고 [Swing threading policy] (http://docs.oracle.com/javase/7/docs/)를 존중하기 위해'EventQueue.invokeLater()'호출에서 모든 메소드를 주 메소드로 감싸고 자합니다. api/javax/swing/package-summary.html # threading) – Robin

+0

실행 메소드와 main mathod에서 main 메소드의 모든 코드를 옮겨야한다.이 $ SwingUtilities.invokeLater (new StartingPoint())를 추가해야한다. ? – Alex

+0

@Alex : 위의 코드에서 * everything * static을 없애고 클래스 자체에서 JPanel GUI를 만든 다음 기본 클래스에서 클래스를 초기화하는 Runnable을 만들고 클래스의 JPanel을 JFrame에 추가 한 다음 JFrame. 예를 들어 위의 ** 편집 2 **를 참조하십시오. –

4

는 말에 setVisible(true)을 추가하고 작동합니다.

관련 문제