【问题标题】:Add more than one panel on a frame on top of each other在彼此顶部的框架上添加多个面板
【发布时间】:2016-03-21 02:25:21
【问题描述】:

我正在做一个显示正方形和圆形的项目。 圆圈自行移动,但用户通过箭头键移动正方形。每当圆圈接触正方形时,它就会反弹。

方形和圆形是不同的类别(2 个不同的面板)。我想将这两个添加到一个框架中,一个在另一个之上,这样两者都是可见的。 谁能告诉我该怎么做?

JFrame n = new JFrame();
n.setTitle("Background Color for JFrame");
n.setSize(1000,600);
n.setLocationRelativeTo(null);
n.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

n.setResizable(false);

n.add(new Ball());
n.add(new Team());

n.setVisible(true);

【问题讨论】:

  • 这会是什么游戏吗?
  • 是的,这是一场足球比赛 :)
  • 那么使用单个 JPane 并使用 Graphics2D 将圆形组件绘制到它可能是一个更好的主意。然后,您的游戏对象将简单地继承 java.lang.Object 并包含一个将图形作为参数的 draw() 方法。
  • 愚蠢的问题,这是我在过去 12 小时内看到的第二个问题,问的是完全相同的问题……是否有某种任务?

标签: java swing jframe jpanel


【解决方案1】:

默认情况下,层次结构中同一级别的用户界面组件假定为不重叠。您可以通过使用setOpaque(false) 使您的组件透明来明确解决此问题,假设您注意只绘制组件中需要的内容,例如如果是 JPanel,请确保不绘制其背景。在执行此操作时,哪个组件优先于另一个组件仍然有些随机(取决于实现)。

有一个专门为此设计的组件:JLayeredPane (https://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html),它管理可以放置组件的“层”,让您完全控制哪些覆盖哪些。

游戏通常自己实现这一点,因为不需要 JComponent 的全部功能来表示简单的图形元素。在这种情况下,单个组件被用作“画布”,将自定义对象绘制到使用 paintComponent 的覆盖上(参见:https://docs.oracle.com/javase/tutorial/uiswing/painting/

【讨论】:

    【解决方案2】:

    如果您想在摇摆中执行此操作,听起来,我真的建议创建一个扩展 JPanel 的新类,并覆盖它的 paintComponent 方法。在此方法中,您使用参数中的 Graphics 来绘制画布。然后,您可以将这个自定义面板而不是两个单独的组件添加到您的 JFrame,并在其中处理渲染。然后,此渲染面板可以跟踪所有需要渲染的对象,最好使用 draw(Graphics g) 方法实现一些界面(Drawable?)。这样,您可以使需要渲染的类实现您的 Drawable 接口,然后将其作为列表保留在您的渲染面板中,并在您的 paintComponent 方法中遍历它们并在您的 Drawable 上调用 draw。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 2019-04-22
      • 1970-01-01
      相关资源
      最近更新 更多