如何将多个JComponent子类添加到JPanel?

时间:2014-06-08 23:10:57

标签: java swing layout layout-manager jcomponent

我和几个人一起玩游戏。这个游戏要求我们创建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,因此我可以指定块的确切位置和大小。初始化块时,构造函数会获取块左上角的x和y坐标,默认大小为20x20像素。我也在两个块上调用setBounds(),这样理论上它们就会彼此相邻。但是,当我编译并执行代码时,只显示第一个代码。任何理由为什么,以及如何解决这个问题? 另外,你会如何添加一个Line和一个Block?我有它,所以创建两行可以创建一个ArrayList个行,并且在绘制一个新行之后,它会添加到ArrayList之后,{{1}中的先前添加的行之后在容器中绘制。当我尝试添加一个Block并绘制一条Line时,我无法开始绘制一条Line,我认为这是因为即使Block只占用20x20的空间,它也会占用"整个容器,以便不能添加任何其他东西。

2 个答案:

答案 0 :(得分:0)

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

<强>溶液

Block

使用不同的x和y轴

答案 1 :(得分:0)

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