Java 乒乓球和球拍不可见

Java Pong ball and racket aren't visible

我想做一个乒乓球游戏。 球和球拍的运动效果很好。但是当我添加一个带有一些按钮的面板时(按钮用于游戏控制,例如 "start game" 到游戏线程启动的帧,但球和球拍不可见。带有按钮和游戏面板的面板是可见的.

我该如何解决?

public class Pong extends JFrame  {

    JPanel Buttons= new JPanel();
    JPanel Test = new JPanel(); 
    GameThread gamethread;
    JPanel GamePanel = new JPanel();

    int x = 30; // Anfangskoordinaten Schläger 1
    int y = 260;
    int Px = 100, Py = 100; // Anfangskoordinaten Ball
    int x2 = 570, y2 = 260; // Anfangskoordinaten Schläger 2
    int dPx = 10, dPy = 10; // Geschwindigkeit Ball
    boolean Spieler1o = false; // Pfeiltaste oben am Anfang Taste nicht gedrückt
    boolean Spieler1u = false; // Pfeiltast unten
    boolean Spieler2o = false;
    boolean Spieler2u = false;

    static boolean start=false;

    public Pong() {                 
        JFrame frame = new JFrame();
        frame.setSize(800, 800);            
        frame.setFocusable(true);
        frame.setLayout(new FlowLayout());                  
        frame.add(GamePanel,new GamePanel());
        frame.add( Buttons,new Buttons());
        frame.setVisible(true);

    }

    class Buttons extends JPanel implements ActionListener { 
        JButton button1 = new JButton("Pause");
        JButton button2 = new JButton("Start Computer");
        JButton button3 = new JButton("Start Multiplayer");
        JButton button4 = new JButton("Beenden");

        Buttons() {
            setPreferredSize(new Dimension(100, 100));
            Buttons.setBackground(Color.YELLOW);
            Buttons.setLayout(new FlowLayout());
            button1.addActionListener(this);
            button2.addActionListener(this);
            button3.addActionListener(this);
            button4.addActionListener(this);

            Buttons.add(button1);
            Buttons.add(button2);
            Buttons.add(button3);
            Buttons.add(button4);
        }

        @Override
        public void actionPerformed(ActionEvent e) {                    
        }
    }           

    class GamePanel extends JPanel { // draw ball and rackets
        GamePanel(){
            GamePanel.setPreferredSize(new Dimension(600,600));          
            GamePanel.setBackground(Color.YELLOW);           
            gamethread = new GameThread();
            gamethread.start();          
        }

        public void paint(Graphics gr) { // beiden Schläger und Ball
            super.paint(gr);
            Graphics2D g = (Graphics2D) gr; // werden gezeichnet
            g.setColor(Color.YELLOW);
            g.fill(g.getClipBounds()); 
            g.setColor(Color.BLACK);
            g.fillRect(x, y, 10, 80); // Ball und Schläger werden gezeichnet
            g.fillOval(Px, Py, 30, 30);
            g.fillRect(x2, y2, 10, 80);
        }
    }

    class GameThread extends Thread implements KeyListener {   
        GameThread() {  
            addKeyListener(this);
        }                       

        public void run() {
            while(true) {

                TastaturEingabe();
                bewegeBall();
                repaint();              
                try {
                    Thread.sleep(50);
                    System.out.println("Test");
                } catch (InterruptedException e) {
                    return;
                }
            }
        }

        public void bewegeBall() {
            Px = Px + dPx; // die Bewegung
            Py = Py + dPy;

            if (Px < 0) { // Ball prallt von der Wand ab
                Px = 0;
                dPx = -dPx;
            }
            if (Py < 0) { // Ball prallt von der Wand ab
                Py = 0;
                dPy = -dPy;
            }
            if (Py > 570) { // Ball prallt von der Wand ab
                Py = 570;
                dPy = -dPy;
            }
            if (Px > 570) { // Ball prallt von der Wand ab
                Px = 570;
                dPx = -dPx;
            }

            if (Px <= 40 && Py >= y && Py <= y + 80) { // Hier soll er vom Schläger1 abprallen
                Px = 40;
                dPx = -dPx;
            }

            if (Px >= 540  && Py >= y2 && Py <= y2 + 80) {
                Px = 540;
                dPx = -dPx;
                dPy = -dPy;
            }
        }

        public void TastaturEingabe() {
            if (Spieler1o == true) { // Bewegung Schläger1
                y -= 12;
            }
            if (Spieler1u == true) {
                y += 12;
            }
            if (Spieler2o == true) { // Bewegung Schläger2
                y2 -= 12;
            }
            if (Spieler2u == true) {
                y2 += 12;
            }

            if (y2 > 520) { // 600-80 wegen Schlägerlänge
                y2 = 520; // Damit die Schläger nicht aus dem Bild verschwinden
            }
            if (y2 < 0) {
                y2 = 0;
            }
            if (y < 0) {
                y = 0;
            }
            if (y > 520) {
                y = 520;
            }
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_W) {
                Spieler1o = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_S) {
                Spieler1u = true;
            }

            if (e.getKeyCode() == KeyEvent.VK_UP) { // Spieler2 hier wird geguckt ob Taste gedrückt
                Spieler2o = true;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                Spieler2u = true;
            }           
        }

        @Override
        public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_W) {
                Spieler1o = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_S) {
                Spieler1u = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_UP) {
                Spieler2o = false;
            }
            if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                Spieler2u = false;
            }

        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub      
        }       
    }

    public static void main(String[] args) {
        new Pong();             
    }           
}   

您的代码错误太多,无法全部更正。但这里有几个例子。

这些字段

JPanel Buttons= new JPanel();
JPanel Test = new JPanel(); 
JPanel GamePanel = new JPanel();

错误,应删除。首先,不要给字段名称以大写字母开头,特别是如果那个确切的名称是 class 的名称。更特别的是,当它们没有被分配 class 的实例时,它们将以它们命名。

Test 从未使用过。
Buttons 不是 Buttons 的一个实例,只是一个 new JPanel() (所以它不会显示任何内容)。
GamePanel 不是 GamePanel 的一个实例,只是一个 new JPanel()(所以它不会显示任何内容)。

您似乎遇到了一些编译错误,因此您刚开始向 class 添加字段,直到它们消失。

如果您想要 Pong class 中的 ButtonsGamePanel 实例,您可以

Buttons buttons = new Buttons();
GamePanel gamePanel = new GamePanel();

现在他们实际上使用的是您编写的 classes,而不是普通的 JPanel

其次,您的 Pong class 扩展了 JFrame,但在其构造函数中您创建了 另一个 框架 JFrame frame = new JFrame();。如果 Pong 应该是你的框架,你需要使用它,而不是制作另一个框架,当你的构造函数结束时你将失去所有引用。

然后,如果您想使用流式布局向框架的内容窗格添加内容,您可以这样做:

public Pong() {
    setSize(800, 800);
    setFocusable(true);
    Container cp = getContentPane();
    cp.setLayout(new FlowLayout());
    cp.add(gamePanel);
    cp.add(buttons);
    setVisible(true);
}