Java Swing-JFrame有时大于首选大小
我正在写一个蛇的游戏,但是有一个小问题。有时面板和框架之间有一点间隙。我真的不知道是什么问题,因为它看起来如此不规则 SSCCE:Java Swing-JFrame有时大于首选大小,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在写一个蛇的游戏,但是有一个小问题。有时面板和框架之间有一点间隙。我真的不知道是什么问题,因为它看起来如此不规则 SSCCE: public class Game { static JFrame frame = new JFrame("The Snake Game"); static Game game = new Game(); JPanel cards; static JPanel card1 = new JPanel(); private Game() { } publ
public class Game {
static JFrame frame = new JFrame("The Snake Game");
static Game game = new Game();
JPanel cards;
static JPanel card1 = new JPanel();
private Game() {
}
public void addComponentToPane(Container pane) {
// CARD 1
card1.setLayout(null);
card1.setPreferredSize(new Dimension(600, 625));
CardLayout cl = new CardLayout();
cards = new JPanel(cl);
cards.add(card1);
pane.add(cards, BorderLayout.CENTER);
}
private static void createAndShowGUI() {
game.addComponentToPane(frame.getContentPane());
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
} // end of main
}在调用
pack
出于某种原因,以另一种方式进行操作似乎会使宽度和高度增加约10-20个像素
如果这不起作用,请在框架显示后调用
setresizeable
好的,我知道这是一种令人厌恶的方式。但在问题中说:“您可以在调用JFrame#setresizeable
之后通过调用JFrame#pack
重置它。”。所以我想,为什么不重置两次呢
代码:
因此,当宽度大于我的首选大小时,第二次调用方法
pack()
似乎可以解决问题。我今天遇到了同样的问题。在谷歌搜索了一下之后,我找不到任何好的答案。库巴给了一个很好的暗示,问题终于解决了。我猜这个问题是由setresizeable(false)函数的延迟引起的,因此它偶尔会发生。我的解决方案是在调用SetResizeable后添加一个短保持
setResizable(false);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
嗯……首先,您没有正确使用
CardLayout
。嗯,那么正确的用法是什么呢?有时候面板和框架之间有一点间隙代码>-确保创建GUI的代码在EDT上执行。另外,不要使用静态变量。@camickr-是的,我只是不把它包含在这里以缩短它。:)创建CardLayout的实例:CardLayout cl=new CardLayout()
在setLayout(cl)
方法中传递该实例。添加其他容器(card1,card2),如下所示:cards.Add(card1,“card1”)代码>。显示所需的JPanel
:cl.show(卡片,“card1”)
(显示card1JPanel
)。我刚刚尝试了调用SetResizeable
的每一种组合,但都不起作用。但是,当根本不使用setresizeable
时,它可以完美地工作。
setResizable(false);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}