无法将图形添加到JPanel

时间:2013-05-11 22:11:45

标签: java swing jpanel layout-manager java-2d

我在网上看过,但我仍然无法理解如何将图形添加到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);

}

文本只会出现在屏幕的一个非常小的部分(这适用于我尝试绘制的任何图形对象)。我做错了什么?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

跳出来的两件事

  1. 您的游戏面板没有首选大小,默认情况下为0x0。 FlowLayout将使用此信息来决定如何最好地布局面板。因为大小是0x0,重绘管理器将忽略它。尝试覆盖getPreferredSize方法并返回适当的大小或使用不使用首选大小的布局管理器,例如BorderLayout
  2. 您的paintComponent方法必须致电super.paintComponet