当前位置: 首页 > 知识库问答 >
问题:

向JPanel添加图形时遇到问题

张浩阔
2023-03-14

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

}

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

共有2个答案

苍和裕
2023-03-14

两件事跳出来了

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

FlowLayout尊重组件的首选尺寸。因此,重写getPreferredSize,为您的JPanel提供一个可见的尺寸,而不是当前在JFrame 35; 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));
 类似资料:
  • 我正在创建一个TicTacToe游戏。我把所有带有ActionListeners的后端放在按钮上,将按钮添加到面板,设置框架等等。 然而,当我运行程序时,我的JPanel似乎没有添加到JFrame中。我试过使用不同的布局,仔细检查是否确实放置了。为所有内容添加行,之前的所有帖子似乎都指向了我认为已经涵盖的内容。 如果这真的很直接,我提前道歉。 谢谢你的帮助。

  • 我一直在努力将一个简单的东西作为值标签添加到Pandas数据框条形图中。我已经查看了20多个线程(其中这三个最有帮助-如何在matplotlib中的条形图中的列上显示文本?、matplotlib高级条形图和Python熊猫/matplotlib在条形图列上注释标签,但什么都不起作用。 我的数据一点也不复杂。数据帧结构为: 年份是数据帧的索引。 我正在寻找的表示很简单。所有产品的堆叠条形图,只有“总

  • 我创建了一个JPanel,上面有我需要的所有JRadioButtons(称为PortSettings)。我还有一个按钮,叫做端口设置,当用户单击该按钮时,我需要JPanel上来显示单选按钮。我尝试将JPanel添加到actionlistener中,但没有效果。我的代码在下面。除了portsettings按钮之外,我已经从其他按钮中删除了所有其他ActionListener。如果这个问题让人困惑,我

  • 问题内容: 将包含图形的添加到时,效果很好。但是,当我尝试添加 其中添加了其他图形的时,它不会显示在中。请参见下面的代码 问题答案: 请注意类的构造函数,使其成为您的习惯,以遵循本示例中所示的顺序。首先向中添加组件,然后再进行调用,例如 ,而不是在此之前。 始终把它当作习惯,每当您覆盖方法时,也要覆盖方法。 并始终像在EDT- 事件调度线程中那样发出呼叫。请阅读Swing中的Concurrency

  • 我是java swing的新手,现在我使用NetBeant使用NetBeans中内置的拖放设计器构建GUI。我现在面临的问题是,我有下面发布的代码,它是在Eclipse中编写的,正如您所看到的,我有一个扩展JPanel的类,我将从WEB_CAM捕获的图像添加到该JPanel中。现在,自从我切换到NetBeans,我使用设计器创建了JFrame、JPanel和JButtons,在我用NetBeans

  • 我想添加一个图像到一个JPanel中,JPanel在JInternalFrame中,JInternalFrame有一个父,JDesktopPane。 我尝试使用另一个类从路径添加图像,然后,