【问题标题】:How to repaint all JPanels upon resizing?如何在调整大小时重新绘制所有 JPanel?
【发布时间】:2019-04-17 22:33:30
【问题描述】:

我目前有 2 个 JPanel 被添加到 JFrame。调整窗口大小后,只有最近添加的 JPanel 会调整大小。如何确保所有 JPanel 都调整大小?在我的程序中,我发射了一个烟花并有网格线。我希望每个人都拥抱屏幕底部。

使用此代码,发射的烟花会调整大小以拥抱,但网格线不会:

JFrame frame = new JFrame();
frame.setSize(950,800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

GuiTest test = new GuiTest();
frame.add(test, BorderLayout.PAGE_END);
frame.setVisible(true);

Grid grid = new Grid();
frame.add(grid);
frame.setVisible(true);

FireworkP canvas = new FireworkP(150, 45, 7, 2);
frame.add(canvas);
frame.setVisible(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);

使用此代码,会发生相反的情况:

JFrame frame = new JFrame();
frame.setSize(950,800);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

GuiTest test = new GuiTest();
frame.add(test, BorderLayout.PAGE_END);
frame.setVisible(true);

FireworkP canvas = new FireworkP(150, 45, 7, 2);
frame.add(canvas);
frame.setVisible(true);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);

Grid grid = new Grid();
frame.add(grid);
frame.setVisible(true);

默认状态:https://i.imgur.com/cpzpBha.png

代码 1 已调整大小:https://i.imgur.com/SRdh2oA.png

代码 2 已调整大小:https://i.imgur.com/VHY4Ff1.png

【问题讨论】:

  • 所有 Swing 组件在调整大小时都应该重新绘制自己。您可能应该假设一个 JPanel 未调整大小或由于其他原因未更新。您是否在使用任何自定义(不是 Swing,而是您自己的作品)组件?
  • 您使用不同的参数调用了两次frame.add(canvas);。只有最后一个将处于活动状态。一次只能有一个主要内容。
  • 那么有没有办法拥有一个单独的网格线类,或者我应该将它们组合起来?我不明白为什么他们都不活跃。
  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example

标签: java swing graphics jframe jpanel


【解决方案1】:

那么有什么办法可以有一个单独的网格线类,还是应该将它们组合起来?

您建立了父/子关系。

所以你的逻辑是这样的:

FireworkP foreground = new FireworkP(150, 45, 7, 2);
foreground.setOpaque( false );

Grid background = new Grid();
background.add(foreground);

frame.add(background);
frame.setVisible(true);

以上假设:

  1. 您的 FireworkP 和 Grid 类是 JPanel,您可以在其中进行自定义绘画。
  2. 您的课程使用适当的布局管理器

所以现在你的 GUI 有这样的结构:

- frame
    - background
        - foreground

所以你的组件可以在 Z 轴上相互叠加。

如果您将多个组件添加到同一个面板,则组件将绘制在 X/Y 轴上

【讨论】:

  • @mander39 阅读 Custom Painting 上的 Swing 教程部分。我猜你的烟花的首选尺寸是 (0, 0),所以没有什么可以画的。您需要重写 getPreferredSize() 方法以返回面板的大小,以便布局管理器可以完成其工作。
  • 好吧,使用教程一切都会显示出来,但它仍然只是更新 1/2 面板的位置。我认为现在是废弃代码的时候了,拥有 2 个面板是行不通的。我会以某种方式将网格放在烟花paintComponent中。
  • 花了 5 分钟来组合它们,任何阅读本文寻求帮助的人只需组合您的paintComponents 并添加相应地改变和重新绘制图形的 gui 元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多