这是我在这里发表的第一篇文章,我有一个看起来很菜鸟的问题,但这在过去一个小时左右一直困扰着我。
我正在制作一个简单的 JFrame,其中包含 JPanel,但 Windows 7 边框似乎挡住了我对面板部分内容的查看。例如,如果我在坐标 0,0 处画一个小正方形,它不会出现,我怀疑它在窗框后面。
我尝试过使用 pack、setsize、setpreferred size、setressized 和不同的布局,但我无法让它显示前 20 个像素左右!
这就是我所拥有的:
public RedSunGame() {
super("Red Sun");
rs = new JPanel(new BorderLayout(), true);
rs.setPreferredSize(new Dimension(WIDTH, HEIGHT));
add(rs, "Center");
setPreferredSize(new Dimension(WIDTH, HEIGHT));
pack();
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
EDIT:
感谢您的所有回复,抱歉缺少信息:)
我正在使用我在书中看到的双缓冲区策略。 gameRender 和 PaintScreen 位于标准游戏循环中。我的 RedSunGame 类扩展了 JFrame。除上述之外,您可能需要的所有相关代码:
private static final int WIDTH = 500;
private static final int HEIGHT = 500;
private JPanel rs;
private Graphics2D g2d;
private Image dbImage;
private void gameRender() {
//create buffer
if (dbImage == null){
dbImage = createImage(WIDTH, HEIGHT);
g2d = (Graphics2D)dbImage.getGraphics();
}
//clear screen
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.blue);
g2d.setFont(font);
g2d.drawString("FPS: " + FPS, 0, HEIGHT);
g2d.fillRect(30, 30, 10, 10);
}
private void paintScreen() {
Graphics g;
try {
g = getGraphics();
if ((g != null) && (dbImage != null))
g.drawImage(dbImage, 0, 0, null);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
catch (Exception e)
{ System.out.println("Graphics context error: " + e); }
}
根据我当前的设置,它看起来像这样。https://i.stack.imgur.com/lNhcq.png
如果我有 g2d.fillRect(30, 30, 10, 10),就会发生这种情况,唯一的变化是坐标 30,30 而不是 0,0。它肯定隐藏在顶部边框后面。https://i.stack.imgur.com/F5PSb.png
此外,将其设置为 BorderLayout.CENTER 似乎在任何这些情况下都没有什么区别。
(抱歉,新用户不允许发布图片)
EDIT:我想到了。我直接在 JFrame 上绘图。 @Guillaume Polet我明白为什么你不应该重写JFrames的paint方法,因为它绘制到框架而不是实际应该显示内容的面板!谢谢