Java 为什么赢了';JPanels显示屏上没有显示吗?
我正在学习Java中的swing和awt编程,所以我决定制作Pong。主类是父JFrame。它实例化一个球和一个桨并添加它们(它们是JPanel)。但是,仅显示最后添加的一个。我该如何解决这个问题 代码: } 球类: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
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
,因为这是IMOsetLayout(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());