如何在 Java 中移动 JFrame 上的 JPanel?

How can I move a JPanel on a JFrame in Java?

所以我想用 java 从头开始​​制作一个简单的类似乒乓球的游戏。 我目前正在移动两个桨。 但是,我一开始就陷入困境。 我正在尝试设置 2 个桨的起始位置,但我不能。 我试图通过设置自定义布局,但后来我当然想通过移动它们来不断改变它们的位置。

我有以下代码:

package com.kristof;
import javax.swing.*;
import java.awt.*;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("gEngine");
        Player playerOne = new Player();
        Player playerTwo = new Player();

        frame.add(playerOne.getMyPanel());
        frame.add(playerTwo.getMyPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.RED);
        frame.setSize(1280, 720);
        frame.setResizable(false);
        frame.setVisible(true);
    }

    public static class Player {
        private JPanel myPanel;

        public Player() {
            this.myPanel = new MyPanel();
        }

        public JPanel getMyPanel() {
            return myPanel;
        }

    }

    static class MyPanel extends JPanel {
        public MyPanel() {
            setBackground(Color.BLACK);
        }
        @Override
        public void paintComponent(Graphics g) {
            // let the component be painted "natural"
            super.paintComponent(g);
            // Do custom painting
            g.setColor(Color.WHITE);
            g.fillRect(50, getHeight() / 2, 20, 120);
        }
    }

}

我已经尝试通过在他们的 myPanel 上调用 setLocation 方法来改变他们的位置,但这没有用。

所以您创建了一个玩家 class,但是您在 class 中没有玩家的位置。

由于桨只会上下移动,我们只需要改变 y 坐标的方法。

  static class Player{
    int x;
    int y;

   Player(int x){this.x=x;}

   void moveUp(){y--;}
   void moveDown(){y++;}

   void drawPlayer(Graphics2D g){
       g.fillRect(x,y,40,120);
   }

}

现在,在扩展 JPanel 的 class 中(在您的情况下 MyPanel),我们可以将新创建​​的 Player class 作为输入(通过将其放入构造函数)

我们还可以创建一个计时器,以便定期刷新帧。 通过在时钟中添加players[0].moveDown;,第一个桨将每帧向下移动

在paint方法中我们可以遍历玩家并使用Playerclass中的drawPlayer方法显示他们。

 MyPanel(Player[] players) {
        this.players = players;
        setBackground(Color.BLACK);

        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                repaint();
                players[0].moveDown;
            }
        }, 300, 1000 / 60);
    }

 @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);

        for(Player p : players){
            p.drawPlayer((Graphics2D) g);
        }
    }

现在把它们放在一起,我们只需要在启动程序时创建播放器。

Player[] players = new Player[]{
            new Player(100),
            new Player(1000)
    };
    frame.add(new PongWindow(players));

代码整体如下:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Timer;
    import java.util.TimerTask;

    public class Main {
        

        public static void main(String[] args) {



            JFrame frame = new JFrame("gEngine");

            Player[] players = new Player[]{
                    new Player(100),
                    new Player(1000)
            };
            frame.add(new PongWindow(players));


            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setBackground(Color.RED);
            frame.setSize(1280, 720);
            frame.setResizable(false);
            frame.setVisible(true);




        }


        static class Player{
            int x;
            int y;

            Player(int x){this.x=x;}

            void moveUp(){y+= -8;}
            void moveDown(){y+= 8;}

            void drawPlayer(Graphics2D g){
                g.fillRect(x,y,40,120);
            }

        }


        static class PongWindow extends JPanel {

            //private JPanel panel = new JPanel();
            Player[] players;

            PongWindow(Player[] players) {
                this.players = players;
                setBackground(Color.BLACK);

                new Timer().scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        repaint();
                        players[0].moveDown();
                    }
                }, 300, 1000 / 60);


            }



            @Override
            public void paint(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.WHITE);

                for(Player p : players){
                    p.drawPlayer((Graphics2D) g);
                }
            }
        }

    }