Java 向JPanel添加图形时遇到问题

Java 向JPanel添加图形时遇到问题,java,swing,jpanel,layout-manager,java-2d,Java,Swing,Jpanel,Layout Manager,Java 2d,我已经在网上看过了,但是我仍然无法理解如何向JPanel添加图形 以下是我的panel类的代码: public class GamePanel extends JPanel { public GamePanel(){ } public void paintComponent(Graphics g) { g.drawString("asd", 5, 5); } } 我的主要方法是: public static void main(Stri

我已经在网上看过了,但是我仍然无法理解如何向JPanel添加图形

以下是我的panel类的代码:

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);

}

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

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));

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));
两件事跳出来了

  • 您的游戏面板没有首选大小,默认情况下为0x0
    FlowLayout
    将使用此信息来决定如何最好地布局面板。由于大小为0x0,重绘管理器将忽略它。尝试重写
    getPreferredSize
    方法并返回适当的大小,或者使用不使用首选大小的布局管理器,如
    BorderLayout
  • 您的
    paintComponent
    方法必须调用
    super.paintComponet
  • 两件事跳出来了

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

  • 非常感谢!还有一个问题,当我尝试在0,0处绘制一个矩形时,当矩形正确地从x坐标0开始时,y坐标似乎比0高一点点(屏幕顶部和矩形之间有一点间隙)。这正常吗?如果是,我能解决这个问题吗?编辑:我的面板和框架尺寸相同,所有这些都是
    FlowLayout
    使用的默认间隙。使用零尺寸垂直间隙来纠正此问题。看到了吗!还有一个问题,当我尝试在0,0处绘制一个矩形时,当矩形正确地从x坐标0开始时,y坐标似乎比0高一点点(屏幕顶部和矩形之间有一点间隙)。这正常吗?如果是,我能解决这个问题吗?编辑:我的面板和框架尺寸相同,所有这些都是
    FlowLayout
    使用的默认间隙。使用零尺寸垂直间隙来纠正此问题。请参阅更新不要设置顶级容器的大小。而是布局内容&调用
    pack()
    。不要设置顶级容器的大小。而是布局内容&调用
    pack()