【问题标题】:How to add multiple subclasses of JComponent to a JPanel?如何将 JComponent 的多个子类添加到 JPanel?
【发布时间】:2014-07-29 11:52:21
【问题描述】:

我正在和几个人一起开发一款游戏。这个游戏要求我们创建 JComponent 的子类,每个子类都有自己的 paintComponent() 方法,当它被添加到容器时调用。这些子类称为 Block、Goal、Spike、Ball 和 Pit。将这些组件中的一个添加到框架中没有问题,因为没有任何其他组件随之添加。我已经在主菜单的同一个 JPanel 中添加了多个 JButton,并且 JButton 还扩展了 JComponent,所以我们都假设我们的子类也可以工作。但是,当我们尝试添加多个这些(即使是相同类型)时,只有其中一个(如果有)显示在框架中。我们还跟踪用于在窗口中绘制线条的鼠标点击和鼠标运动(让球反弹),并且添加线条和另一个组件也不起作用。到目前为止,这是我们认为可以解决问题的唯一方法,但没有:

Container c = this.getContentPane();
c.setLayout(null);
Block b = new Block(200, 200);
Block b1 = new Block(220, 200);
b.setBounds(200, 200, 20, 20);
b1.setBounds(220, 200, 20, 20);
c.add(b);
c.add(b1);
c.revalidate();

此方法尝试在同一个容器中添加两个块。由于我将Container的布局设置为null,因此我可以指定Block的确切位置和大小。初始化一个 Block 时,构造函数接受该块左上角的 x 和 y 坐标,默认大小为 20x20 像素。我还在两个块上调用setBounds(),这样理论上它们就可以彼此相邻。但是,当我编译并执行代码时,只显示第一个。关于为什么,以及如何解决这个问题的任何原因? 另外,例如,您将如何添加 Line 和 Block?我有它,以便创建两条线工作,创建线的ArrayList,并在绘制新的线后,将其添加到ArrayList,在ArrayList 中先前添加的线被绘制在容器。当我尝试添加一个块并绘制一条线时,我无法开始绘制一条线,我认为这是因为即使块只占用 20x20 的空间,它也“占用”了整个容器,所以没有其他东西可以已添加。

【问题讨论】:

  • Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。为强大的 GUI 组织组件,而不是 use layout managerscombinations of them,以及 white space 的布局填充和边框。
  • b.setBounds(200, 200, 20, 20); b.setBounds(220, 200, 20, 20); 你意识到这是设置一个组件的边界两次,而不是设置两个组件的边界一次?
  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing layout layout-manager jcomponent


【解决方案1】:
however, when I compile and execute the code, Only the first one shows up

那是因为您在绝对布局上使用相同的 x 和 y 轴而与另一个重叠。

问题:

    Block b = new Block(200, 200);
    Block b1 = new Block(200, 200);

b1 将在 b 之上,这就是为什么你只能看到一个块

解决方案:

Block 使用不同的 x 和 y 轴

【讨论】:

  • 那么是否可以为添加的每个单独组件使用“不同的”x 和 y 轴?
  • @user2197420 更改您的设置边界,第一个参数是 x,第二个是 y。不要使用相同的 x 和 y 轴
  • 当我完全分开两个块(一个在 (200, 200) 另一个在 (300, 300))时,什么都没有出现。甚至我添加到内容窗格的第二个都没有出现。
【解决方案2】:
b.setBounds(200, 200, 20, 20);
b.setBounds(220, 200, 20, 20);

我认为你有一个错字。您为同一个组件设置了两次边界,因此第二个组件的大小仍然为 (0, 0),这意味着没有可绘制的内容。

我想你想要:

b.setBounds(200, 200, 20, 20);
b1.setBounds(220, 200, 20, 20); // note the b1

【讨论】:

  • 是的,抱歉,这只是输入问题时的拼写错误。在我的代码中,它实际上是 b.setBounds() 和 b1.setBounds()(带有正确的参数)。
  • 不要输入代码。使用复制/粘贴,这样您就不会出现拼写错误。发布一个正确的SSCCE 来证明问题。
猜你喜欢
  • 1970-01-01
  • 2022-12-07
  • 2023-03-17
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2012-05-02
  • 2011-09-13
  • 2013-12-12
相关资源
最近更新 更多