gpt4 book ai didi

java - 将多个 JPanel 扩展组件添加到 JFrame

转载 作者:行者123 更新时间:2023-12-01 10:41:23 24 4
gpt4 key购买 nike

我是 Java 新手,最近一直在尝试制作 Atari Breakout 游戏。我设法让玩家移动并使球弹起,但在 JFrame 中不同时(最新添加的组件是正在显示的组件)。我为玩家和球创建了两个单独的类(均从 JPanel 扩展),我认为这可能是问题所在,尽管我真的不知道。

无论如何,这是播放器的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;
import javax.swing.Timer;


public class Player extends JPanel implements ActionListener, KeyListener{
Timer t = new Timer(5,this);
int x=200,vel=0;
boolean outOfBoundsR = true, outOfBoundsL = true;
public Player(){
t.start();
addKeyListener(this);
setFocusable(true);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle r= g2.getClipBounds();
r.x = x;
g2.setColor(Color.blue);
g2.fill(new Rectangle2D.Double(r.getX(),350,100,5));
if(r.getX()>385){
vel=0;
outOfBoundsR = false;
}else if(r.getX()<0){
vel=0;
outOfBoundsL = false;
}

}
public void actionPerformed(ActionEvent e){
repaint();
x+=vel;
}
public void right(){
vel = 1;
}
public void left(){
vel = -1;
}
public void keyPressed(KeyEvent e){
int key = e.getKeyCode();
if(key == KeyEvent.VK_RIGHT&&outOfBoundsR){
outOfBoundsL=true;
right();
} else if(key == KeyEvent.VK_LEFT&&outOfBoundsL){
outOfBoundsR=true;
left();
}

}
public void keyReleased(KeyEvent e) {vel = 0;}
public void keyTyped(KeyEvent e) {}
}

这是球的代码:

 import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import javax.print.attribute.standard.Media;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Ball extends JPanel implements ActionListener{
Timer t = new Timer(5,this);
double velx = 0, vely = -1, x = 250, y = 330;

public Ball(){
t.start();
setFocusable(true);
}

public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle r = g2.getClipBounds();
r.x = (int) x;
r.y = (int) y;
g2.fill(new Ellipse2D.Double(r.getX(), r.getY(), 8, 8));
if(r.getY() < 0 || r.getY() > 355){
vely -= (vely*2);
}else if(r.getX() < 0 || r.getX() > 480){
velx -= (velx*2);
}
}

public void actionPerformed(ActionEvent e) {
repaint();
x += velx;
y += vely;
}

}

这是 GUI 的代码:

import javax.swing.JFrame;

public class Gui extends JFrame{

public static void main(String[] args) {

JFrame f= new JFrame(); // the frame
Ball b = new Ball(); // the ball
Player p = new Player();// the player

f.getContentPane().add(p);
f.getContentPane().add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(500,400);
f.setVisible(true);
}

}

提前致谢! (我知道这有点长......)

最佳答案

我不知道您希望您的 BallPlayer 对象如何交互,但在您的示例中 f.getContentPane().add(.. .) 转换为 f.getContentPane().add(..., BorderLayout.CENTER)。因此,在后续调用 add 中,p 被替换为 b - JFrame 的内容 Pane 利用默认情况下为 BorderLayout

看看 Swing layout manager tutorial了解更多信息。

关于java - 将多个 JPanel 扩展组件添加到 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com