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

标签 java swing

我是 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/

相关文章:

java - Apache Spark 与 elasticsearch V5.X

java - Jboss 7 - 从辅助数据库自动切换回主数据库

java - ScrollView 落后于 Android 中的按钮

java - 带有打开的组合框的面板的屏幕截图

java - 在任务栏上显示 Jframe 但不显示标题栏

java - 如何在jcombobox中动态添加元素?

java hashmap键

java - 我有 2 个服务类,它们都使用 Autowiring 的 bean 扩展同一个父类,我可以在一个类中使用 bean,但不能在另一个类中使用

java - 在java中访问系统插入符闪烁率

java - 创建具有多个面板和一个框架的 GUI