2013-05-11 43 views
0

我在网上看了看,但是我仍然无法理解如何将图形添加到JPanel无法新增图形的JPanel

这里是我的面板类的代码:

public class GamePanel extends JPanel { 

    public GamePanel(){ 

    } 

    public void paintComponent(Graphics g) { 

     g.drawString("asd", 5, 5); 
    } 

} 

和我主要方法:

public static void main(String[] args) { 

    frame.setLayout(new FlowLayout()); 
    frame.getContentPane().setBackground(Color.WHITE); 

    //i is an instance of GamePanel 
    frame.add(i); 

    frame.setPreferredSize(new Dimension(500, 500)); 
    frame.pack(); 
    frame.setVisible(true); 

} 

文本只会出现在屏幕的一个很小的部分(这适用于任何图形对象我试着画出)。我究竟做错了什么?

+0

不要设置顶层容器的大小。而是布置内容并调用'pack()'。 – 2013-05-12 06:25:27

回答

2

FlowLayout尊重部件的优选尺寸。因此覆盖getPreferredSize给你JPanel可见的大小,而不是默认的零大小尺寸的面板目前有JFrame#pack后,被称为:

class GamePanel extends JPanel { 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); // added to paint child components 
     g.drawString("asd", 5, 20); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 
} 

编辑:

为了消除JPanel及其含差距JFrame,垂直间距设置为0

frame.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); 
+0

非常感谢!还有一个问题,当我尝试在0,0​​处绘制矩形时,矩形正确地从x坐标为0开始,y坐标似乎比0稍微高一点(在屏幕顶部和矩形)。这是正常的吗?如果是这样,我能解决这个问题吗?编辑:我的面板和框架大小是一样的,一切都是 – user2373733 2013-05-11 22:25:49

+0

这是FlowLayout使用的默认空白。使用零大小的垂直间隙来纠正此问题。查看更新 – Reimeus 2013-05-11 22:30:17

+0

啊,谢谢!现在完美的工作! – user2373733 2013-05-12 00:48:52

1

两件事跳到out

  1. 您的游戏面板没有首选大小,默认情况下它会生成0x0。 FlowLayout将使用此信息来决定如何最好地布置您的面板。由于大小是0x0,重绘管理器将忽略它。尝试重写getPreferredSize方法,并返回一个合适的大小,或者使用不使用首选大小布局管理器,像BorderLayout
  2. paintComponent方法必须调用super.paintComponet