Java项目仅在调整窗口大小后显示
我在一帧中有两个JPanel。第一个面板包含java项目,如按钮等。我添加的两个按钮会出现,但JSpinner会在我调整窗口大小后出现。我想这也会发生在我要添加的其他项目上。我怎样才能解决这个问题Java项目仅在调整窗口大小后显示,java,swing,jpanel,Java,Swing,Jpanel,我在一帧中有两个JPanel。第一个面板包含java项目,如按钮等。我添加的两个按钮会出现,但JSpinner会在我调整窗口大小后出现。我想这也会发生在我要添加的其他项目上。我怎样才能解决这个问题 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java
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(…)
,而是让组件使用其首选的大小自行调整大小,并在使用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);
}
}
在末尾添加
setVisible(true)
,它就可以工作了。你想把你的所有代码包装在EventQueue中的main方法中。invokeLater()
调用要尊重我应该在run方法中从main方法移动所有代码,在main方法中,我必须添加$SwingUtilities.invokeLater(new StartingPoint())@Alex:您可以去掉上面代码中的所有静态内容,在类本身中创建您的JPanel gui,然后在主界面中创建一个可运行的来初始化您的类,将类的JPanel添加到JFrame中,然后显示JFrame。例如,请参见上面的编辑2。我在编辑2中做了类似的更改,但现在它在线程“AWT-EventQueue-0”java.lang.StackOverflower中不起作用。我应该创建一个新线程还是什么?再次感谢你。你是说在StackOverflow有一个新的线程吗?是的,可能是因为这是一个新问题。它闻起来好像你在递归地做一些事情,比如让一个方法本身调用它,或者在它内部调用一个类自己的构造函数。