这是我的第一篇文章,我有一个问题,似乎真的不好意思,但这一直困扰着我在过去的一个多小时左右。窗框覆盖图形内容
我正在制作一个简单的带有JPanel的JFrame,但Windows 7边框似乎阻止了我对面板部分的查看。例如,如果我在坐标0,0处画一个小方块,它就不会出现,我怀疑它是在窗框后面。
我已经尝试了与包,setsize,setpreferred大小,setresizable和不同的布局搞乱,但我无法得到它显示前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);
}
编辑:
感谢您的回复,比较遗憾的是缺乏信息的:)
我使用的是双我在书中看到的缓冲策略。 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); }
}
与我目前的设置它看起来像这样。 http://i.imgur.com/qaabC.png
这就是发生什么,如果我有g2d.fillRect(30,30,10,10),唯一的变化是坐标30,30而不是0,0。它绝对隐藏在边界上方。 http://i.imgur.com/uzfFe.png
此外,将其设置为BorderLayout.CENTER在这些情况下似乎没有任何区别。
(抱歉,它不会让新用户发表图片)
编辑: 我想通了。我直接绘制到JFrame。 @Guillaume Polet我明白了为什么你不应该重写JFrames的绘制方法,因为它绘制到框架,而不是实际显示内容的面板!由于
截图将解释比文字更清晰... – Thihara
,你发布的代码不显示你要重画的小广场。 –
只是一个建议,不要尝试使用'setXxXSize(...)'方法,因为许多'布局管理器'不尊重用户定义的大小值。让相关的布局管理器负责组件的大小。只需将该组件添加到BorderLayout的中心,就可以解决您的问题,如每个答案中所述:-) –