0

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

}

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

4

2 回答 2

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));
于 2013-05-11T22:19:03.640 回答
1

有两件事跳出来

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