2012-06-21 55 views
3

这是我的第一篇文章,我有一个问题,似乎真的不好意思,但这一直困扰着我在过去的一个多小时左右。窗框覆盖图形内容

我正在制作一个简单的带有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的绘制方法,因为它绘制到框架,而不是实际显示内容的面板!由于

+0

截图将解释比文字更清晰... – Thihara

+0

,你发布的代码不显示你要重画的小广场。 –

+0

只是一个建议,不要尝试使用'setXxXSize(...)'方法,因为许多'布局管理器'不尊重用户定义的大小值。让相关的布局管理器负责组件的大小。只需将该组件添加到BorderLayout的中心,就可以解决您的问题,如每个答案中所述:-) –

回答

3

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

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

如果我像我们一样覆盖代码中的paintComponent,它将起作用,并在角落中绘制一个黄色方块,但由于某些原因,它不适用于我创建的缓冲区。有任何想法吗? – Mike

+0

你的代码有很多问题。我不知道你是否重写了JFrame的'paint'方法,但是如果你这样做:不要! ;-),在ContentPane或其他子组件上执行此操作。现在,对于你的代码,你几乎不应该调用'getGraphics',也不应该持有对'Graphics'的引用。要么使用提供的paintXXX()方法的参数,要么创建自己的(例如,在BufferedImage上,可以调用createGraphics,paint然后处理图形)。至于双缓冲,它在Swing中默认启用,所以不要再次自己动手。 –

+0

用于重写'getPreferredSize()'。 – trashgod

1

确认宽度和高度> 0

试试这个:

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

你可以有你的答案,但对于一个新手的Java Swing我建议你净豆的IDE。它以图形方式添加和布局GUI,并且不需要编写任何手写代码。这是一个伟大的地方开始,因为这里所说:

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

+1

我会建议完全相反:第一个主人Swing“手动”,然后使用GUI-builders,当你知道你在做什么。 SO上出现的许多问题都与使用GUI构建器的人有关,并且根本不了解Swing正在做什么。 –