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

问题描述 投票:0回答:1

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

我有以下代码:

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);
        }
    }

}

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

java swing jframe jpanel
1个回答
0
投票

因此您创建了一个Player类,但是在该类中没有播放器的位置。

由于桨将仅上下移动,我们只需要用于更改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的类(在您的情况下为MyPanel中,我们可以将新创建​​的Player类作为输入(通过将其放入构造函数中)] >>

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

在绘画方法中,我们可以遍历播放器并通过使用drawPlayer类中的Player方法来显示它们。

 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);
                }
            }
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.