窗框覆盖图形内容(Window frame covering graphics content)

2019-06-25 15:21发布

这是我在这里的第一篇文章,我有那看来真的nooby一个问题,但是这已经困扰我过去一小时左右。

我正在与一个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波莱我知道为什么,因为它吸引到的帧而不是面板实际上应该显示的内容,你不应该重写JFrames的paint方法! 谢谢

Answer 1:

这里是展示你的目标如何实现一个示例代码。 试着发现你的代码的差异来找到什么是错的:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RedSunGame {

    private static final int SQUARE_SIZE = 20;
    private JPanel rs;
    private JFrame frame;

    private void initUI() {
        frame = new JFrame("Red Sun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        rs = new JPanel(new BorderLayout()) {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.YELLOW);
                g.fillRect(0, 0, SQUARE_SIZE, SQUARE_SIZE);
            }

            @Override
            public Dimension getPreferredSize() {
                Dimension preferredSize = super.getPreferredSize();
                // Let's make sure that we have at least our little square size.
                preferredSize.width = Math.max(preferredSize.width, SQUARE_SIZE);
                preferredSize.height = Math.max(preferredSize.height, SQUARE_SIZE);
                return preferredSize;
            }
        };
        frame.add(rs);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                RedSunGame redSunGame = new RedSunGame();
                redSunGame.initUI();
            }
        });
    }
}


Answer 2:

验证宽度和高度> 0。

试试这个:

//add(rs, "center");
add(rs, BorderLayout.CENTER);


Answer 3:

你可以有你的答案,但对于一个新手的Java Swing我建议你净豆的IDE。 它以图形方式增加和勾画出GUI和你不需要编写任何手工编写的代码。 这是一个伟大的地方开始,如下所述:

http://docs.oracle.com/javase/tutorial/uiswing/learn/index.html



文章来源: Window frame covering graphics content