gpt4 book ai didi

java - 覆盖图形内容的窗口框架

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:21:58 27 4
gpt4 key购买 nike

这是我在这里发表的第一篇文章,我有一个问题似乎真的很麻烦,但在过去的一个多小时里,这个问题一直困扰着我。

我正在制作一个带有 JPanel 的简单 JFrame,但 Windows 7 边框似乎挡住了我对面板部分的视线。例如,如果我在坐标 0,0 处画一个小正方形,它不会出现,我怀疑它在窗框后面。

我试过 pack、setsize、setpreferred size、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 的 paint 方法,因为它绘制到框架而不是实际应该显示内容的面板!谢谢

最佳答案

这是一个示例代码,展示了如何实现您的目标。尝试找出代码的差异以找出问题所在:

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();
}
});
}
}

关于java - 覆盖图形内容的窗口框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11131654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com