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

在 JFrame 上使用两个 JPanel 时未执行绘制请求?

叶光华
2023-03-14

我试图在一个Jframe上使用两个JPanel。我使用容器将它们添加到框架中。所以当我将第一个JPanel添加到框架中时,会调用油漆组件方法,但当我将第二个JPanel添加到框架中时,JVM不会调用油漆组件方法。

这是代码

public class Frame {

     public Frame() {
        // TODO Auto-generated constructor stub
      }

    public static void main(String[] args)  {
         JFrame gui = new JFrame();
         gui.setTitle("Chain Reaction ;-) ");
         gui.setSize(650,650);
         gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         gui.setLocationRelativeTo(null);
         gui.setVisible(true);  
         Container Pane = gui.getContentPane();
         Panel1 myPane1 = new Panel1(Pane); 
    }
 }

在这里,我将面板1(J面板)对象添加到构造函数中的JFrame中。我正在将容器引用传递给构造函数 。

public class Panel1 extends JPanel {

    Container myPane;

    public Panel1(Container myPane) {
        this.myPane = myPane;
        myPane.add(this);
        addMouseListener(new event(myPane));
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawRect(200, 200, 400, 400);
    }

    public class event extends MouseAdapter {

        Container myPane;

        public event(Container myPane) {
            this.myPane = myPane;
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            Panel2 myPanel2 = new Panel2(myPane);
        }
    }
}

(Panel1类具有侦听鼠标单击的事件类,当鼠标单击时,它会创建Panel2的对象)

public class Panel2 extends JPanel {

    Container myPane;

    public Panel2(Container myPane) {
        this.myPane = myPane;
        myPane.add(this);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawRect(400, 400, 200, 200);
    }

}

Panel2 通过构造函数接收引用容器,然后绘制一个矩形,此绘制请求不是由 JVM 调用的。

帮帮我。我现在应该做什么?

共有1个答案

龙新荣
2023-03-14

默认情况下,JFrame 使用边界布局。将组件添加到框架中并且未指定约束时,该组件将添加到 CENTER。只能将一个元件添加到中心,因此仅显示最后一个元件。

然而,当你添加一个组件到一个可见的贵由时,还需要在你添加组件的面板上调用< code>revalidate()和< code>repaint(),这样布局管理器就可以被调用了。

在您的例子中,您没有调用revalidate(),因此第二个面板的大小为o (0,0),所以没有要绘制的内容。

如果您确实调用了 revalidate(),那么第二个面板将具有大小,但现在第一个面板不会被绘制。

你需要重新设计你的应用或使用不同的布局来获得所需的效果。

此外,在main()方法中,您应该在使框架可见之前将面板添加到框架中。

 类似资料:
  • 我正在制作一个简单的扫雷游戏(顶部没有菜单和其他东西)所有我需要的是一个9x9板,当每个瓷砖被点击时,如果没有炸弹附近,它要么是空白的,要么说有多少炸弹在它附近,或者说B代表炸弹。 我已经正确地完成了以上所有的工作,并且工作得非常完美。我的问题是,我需要在玩游戏时加入一个从0开始并从0开始连续计数的计时器,直到我点击炸弹停止为止。然后,我会在我的黑板下面有一个地方,用户可以输入他们的名字,下面有一

  • 问题内容: 我正在设计一个程序,该程序在JFrame中包含两个JPanel,一个用于保存图像,另一个用于保存GUI组件(Searchfields等)。我想知道如何将图像绘制到JFrame中的第一个JPanel? 这是我的构造函数的示例代码: } 我试图覆盖JPanel的paintComponent方法来绘制图像,但是当我尝试编写时,这在我的构造函数中导致了一个问题: 因为这将只允许我传递null的

  • 问题内容: 我正在尝试制作一个在鼠标本地化处绘制一个圆的简单Java程序,它获取了鼠标的X和Y坐标,但是它没有绘制任何内容,我试图绘制一个String,一个圆和一条线,但是没有任何效果,我稍微修改了代码,但仍然无法正常工作 问题答案: 不要直接在上执行自定义绘画。如果可以,请始终在替代方法上进行操作。 为此,请勿使用无限循环。有用于Mouse Motion收听的

  • 我基本上一直在尝试通过使用JFrame并切换出2个JPanel(一个用于菜单,一个用于实际游戏)来为游戏制作菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法让它工作。如果有人能解释代码的错误,我将不胜感激。 这是我的JFrame、菜单面板和ActionListener actionPerformed调用在此类中创建的面板 同样,如果有人能向我解释一下这段代码的错误,我将不胜感激。谢谢

  • 我创建了一个程序,只需在屏幕上移动一个球。我以前把它都放在一节课上,但我觉得它看起来太乱了,所以我把它分成了三个不同的课:主课。。。初始化一切,游戏。。。它描绘一切,是一个JPanel,AL是一个KeyListener(这也是问题所在)。问题是,我无法让程序从我的AL类重新绘制,无论我试图传递什么。有人能帮忙吗?以下是我的三门课: - -

  • 编辑:当我拖动边框时,某种刷新被发送,我需要弄清楚并手动发送相同的刷新。 请注意,我已经尝试使用revalidate()和repaint()。 当使用JFrame和JPanel来显示一个框架时,我试图使框架的大小易于改变。 null 此外,一个重要的注意事项是,当您拖动边框时,白条会消失,并正确地重新加载/刷新内容(即使您只是少量拖动)