【发布时间】: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 managers 或 combinations of them,以及 white space 的布局填充和边框。
-
b.setBounds(200, 200, 20, 20); b.setBounds(220, 200, 20, 20);你意识到这是设置一个组件的边界两次,而不是设置两个组件的边界一次? -
为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
标签: java swing layout layout-manager jcomponent