只有在调整窗口大小后才会显示Java项目

我在一个框架中有2个JPanel。 第一个面板包含按钮等java项目。我添加的两个按钮出现,但JSpinner在我调整窗口大小后出现。 我想这也将与我将添加的其他项目一起发生。 我怎么能解决这个问题?

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); } } 

您在JFrame上调用setVisible(true) 之后将组件添加到GUI 并且由于您在添加任何内容之前渲染GUI,因此它是向后的,因此有意义的是,稍后添加的内容将不会显示粉刷一新。

相反,首先添加所有组件, 然后通过在JFrame上调用setVisible(true)来呈现GUI。

编辑
此外,您将要避免在任何内容上调用setSize(...) ,而是让组件使用其preferredSizes自行resize,并在使用setVisible(true)显示之前调用JFrame上的pack() setVisible(true)

编辑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); } } 

最后添加setVisible(true)并且它可以工作。