Java 为什么赢了';JPanels显示屏上没有显示吗?

Java 为什么赢了';JPanels显示屏上没有显示吗?,java,swing,jframe,awt,Java,Swing,Jframe,Awt,我正在学习Java中的swing和awt编程,所以我决定制作Pong。主类是父JFrame。它实例化一个球和一个桨并添加它们(它们是JPanel)。但是,仅显示最后添加的一个。我该如何解决这个问题 代码: } 球类: public class Ball extends JPanel implements ActionListener { Timer timer; private Vec2d position; private Vec2d velocity; private Dimension

我正在学习Java中的swing和awt编程,所以我决定制作Pong。主类是父JFrame。它实例化一个球和一个桨并添加它们(它们是JPanel)。但是,仅显示最后添加的一个。我该如何解决这个问题

代码:

}

球类:

public class Ball extends JPanel implements ActionListener {

Timer timer;
private Vec2d position;
private Vec2d velocity;
private Dimension ballSize;

public Ball() {
    super();
    position = new Vec2d(50, 50);
    velocity = new Vec2d(2, 3);
    timer = new Timer(25, this);
    ballSize = new Dimension(40, 40);

    timer.start();
}    


@Override
public void actionPerformed(ActionEvent ae) {
    //Perform game frame logic
    bounceBall();
    repaint(); 
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillArc((int)position.x, (int)position.y, ballSize.width, 
            ballSize.height, 0, 360);
    position.add(velocity);
}

private void bounceBall() {
    if(position.x < 0 || position.x > getWidth() - ballSize.width) {
        velocity.x *= -1;
    }

    if (position.y < 0|| position.y > getHeight() - ballSize.height) {
        velocity.y *= -1;
    }
}
}

请注意,
Vec2d
只是我组合在一起的一个小的二维向量类。此外,Pong逻辑(球拍和球之间的碰撞、得分等)也没有实现。我只是想让它画得正确


提前感谢您的帮助

首先要做的是将
JPanel
s添加到窗口的内容窗格,而不是窗口本身。我很惊讶你没有收到运行时警告

此外,看起来您计划让每个面板填充屏幕,但只绘制其中的一小部分。如果这确实是您想要的方式,那么您需要对它们执行
setOpaque(false)
,以便它们下面的面板可以显示出来。但可能更好的解决方案是使用一个
JPanel
作为绘图表面,并让其
paintComponent()
图形
传递给每个游戏对象,让它们自己绘图

add(new Ball());
add(new Paddle());

默认情况下,JFrame的布局管理器是BorderLayout。如果不指定要添加组件的位置(
BorderLayout.WEST
,或
EAST
,等等),则会在中心添加组件。因此,在同一位置添加两个组件:在中心。因此,只显示其中一个。

您正在将
添加到相同的
边界布局。居中
位置,以便只显示最后添加的一个(即
)。您可以在此处使用
GridLayout
来显示:

setLayout(new GridLayout(1, 2));
add(new Paddle());
add(new Ball());

在“桨”类中,您从未将速度与位置相加。添加(速度)就像您在“球”类中所做的那样。

顺便说一句,您的
Main
类从未创建您的JPanels实例。出于调试目的,我将它们取出,但忘了将它们放进去问这个问题。愚蠢的我!无论如何,它都不能正常工作。您的
Main
类没有使用
layoutManager
。顺便说一句,如果不明确使用布局管理器,SSCCE的默认布局总是
BorderLayout
+1,与probelm无关,但是,1)不要扩展
JFrame
2)不要在
JFrame
上调用
setSize
,而是在
JFrame
上执行一个正确的
LayoutManager
和/或覆盖
JPanel
getPreferredSize
并返回适合图纸的正确大小,然后在设置可见之前调用
JFrame
上的
pack()
。3) 始终通过
swingutilities.invokeXXX
block在事件分派线程上创建Swing组件。正如JB Nizet和Reimeus所说,您正在将您的JPanel添加到相同的位置,在这一点上,我不相信您需要的是
LayoutManager
,因为这是IMO
setLayout(null)的唯一一次
应该使用您的实体是
组件的扩展,而不是建模为实体的类(一个类,它包含属于一个实体的属性,如
getX()
getY()
等)-下面是这样一个逻辑示例:我说我正在尝试解决一个绘图问题,游戏逻辑还没有实现……我只是尝试了GridLayout,它同时显示了这两个,但一旦球经过半个屏幕(因此进入了grid layout的第二列),它就消失了。我创建了一个Board类,添加了JPanel本身。它起作用了。谢谢
add(new Ball());
add(new Paddle());
setLayout(new GridLayout(1, 2));
add(new Paddle());
add(new Ball());