フレームに2つのJPanelがあります。最初のパネルにはJavaボタンなどのアイテムが含まれています。追加した2つのボタンは表示されますが、ウィンドウのサイズを変更した直後に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);
}
}
GUIにコンポーネントを追加していますafter JFrameでsetVisible(true)
を呼び出していますが、何かが追加される前にGUIをレンダリングしているので、逆になります。後で追加したものは、すべて塗り替えるまで表示されません。
代わりに、最初にすべてのコンポーネントを追加し、then JFrameでsetVisible(true)
を呼び出してGUIをレンダリングするだけです。
編集
また、何かでsetSize(...)
を呼び出さないようにしますが、代わりに、preferredSizesを使用して、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)
を追加すると、機能します。