Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JComponent的多个子类添加到JPanel?_Java_Swing_Layout_Layout Manager_Jcomponent - Fatal编程技术网

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

Java 如何将JComponent的多个子类添加到JPanel?,java,swing,layout,layout-manager,jcomponent,Java,Swing,Layout,Layout Manager,Jcomponent,我正在和几个人做一个游戏。这个游戏要求我们创建JComponent的子类,每个子类都有自己的paintComponent()方法,当它被添加到容器中时调用。这些子类被称为Block、Goal、Spike、Ball和Pit。将这些组件中的一个组件添加到框架中没有问题,因为没有其他组件与之一起添加。我已经在主菜单的同一个JPanel中添加了多个JButton,JButton还扩展了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();
此方法尝试在同一容器中添加两个块。因为我将容器的布局设置为
null
,所以我可以指定块的确切位置和大小。初始化块时,构造函数采用块左上角的x和y坐标,默认大小为20x20像素。我还对这两个块调用了
setBounds()
,这样理论上它们就可以紧挨着彼此了。然而,当我编译和执行代码时,只有第一个代码出现。有什么原因可以解释吗?如何解决? 另外,例如,如何添加线和块?我这样做是为了创建两行,这将创建一个
ArrayList
行,在绘制一个新行之后,它将添加到
ArrayList
,在容器中绘制之前在
ArrayList
中添加的行之后。当我试图添加一个块并绘制一条线时,我无法开始绘制一条线,我认为这是因为即使块只占用20x20的空间,它也“占用”了整个容器,因此无法添加任何其他内容

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 b = new Block(200, 200);
    Block b1 = new Block(200, 200);
对两个
块使用不同的x轴和y轴

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

那么,是否可以为添加的每个组件使用“不同”的x轴和y轴?@user2197420更改设置边界第一个参数是x,第二个参数是y。不要使用相同的x轴和y轴当我完全分开两个块(一个在(200200)处,另一个在(300300))时,什么都没有显示。甚至我添加到内容窗格中的第二个也没有出现。Java GUI可能必须在多种平台上工作,使用不同的屏幕分辨率&使用不同的PLAF。因此,它们不利于部件的精确放置。而是组织组件以形成一个健壮的GUI,或者,与.b.setBounds(200、200、20、20)的布局填充和边框一起;b、 立根(220,200,20,20)你意识到这是两次设置一个组件的边界,而不是一次设置两个组件的边界?为了更快地获得更好的帮助,请发布一个(最小完整且可验证的示例)。是的,对不起,这只是键入问题时的一个输入错误。在我的代码中,它实际上是b.setBounds()和b1.setBounds()(带有正确的参数)。不要键入代码。使用复制/粘贴,这样就不会出现打字错误。张贴一个适当的说明问题的帖子。