【问题标题】:Java Pong ball and racket aren't visibleJava Pong 球和球拍不可见
【发布时间】:2018-02-20 15:20:25
【问题描述】:

我想做一个乒乓球游戏。 球和球拍的运动效果很好。但是当我添加一个带有一些按钮的面板时(按钮用于游戏控制,例如“开始游戏”到框架,Gamethread 开始但球和球拍不可见。带有按钮和游戏面板的面板是可见的。

我该如何解决这个问题?

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

【问题讨论】:

  • 这个frame.add(GamePanel,new GamePanel()); 完全不对。您正在将您的 GamePanel 字段(这是一个普通的 JPanel)添加到您的框架中,并使用您的 GamePanel 类的实例作为约束。 (参见Container.add)你继续在下一行对Buttons 做同样的事情。这不是您初始化字段的方式,也不是您向框架添加组件的方式。
  • 好的,谢谢。但我真的不明白。 frame.getContentPane().add(GamePanel,new GamePanel());不要修复它。

标签: java swing awt panel


【解决方案1】:

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

这些字段

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

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

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

看起来你有一些编译错误,所以你刚开始向你的类添加字段,直到它们消失。

如果您想在 Pong 类中创建 ButtonsGamePanel 的实例,您可以拥有

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

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

其次,您的Pong 类扩展了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);
}

【讨论】:

  • 非常感谢。现在它起作用了。但有时球似乎穿过球拍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多