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

这是我在这里的第一篇文章,我有一个看起来真的很笨拙的问题,但这在过去一个小时左右一直困扰着我.

我正在制作一个带有JPanel的简单JFrame,但是Windows 7边框似乎阻止了我对面板各部分的查看.例如,如果我在坐标0,0处绘制一个小正方形,它将不会出现,并且我怀疑它在窗口框架的后面.

我尝试弄乱pack,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); }

}

如果我有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();

}

});

}

}

标签:swing,jpanel,java,user-interface

来源: https://codeday.me/bug/20191101/1981711.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值