Java 简单的乒乓球游戏;Can';不要让桨在屏幕上移动

Java 简单的乒乓球游戏;Can';不要让桨在屏幕上移动,java,swing,jbutton,actionlistener,pong,Java,Swing,Jbutton,Actionlistener,Pong,我正在尝试创建简单的乒乓球游戏。 我正在做的第一件事是,当用户单击框架中提供的“左”或“右”按钮时,让挡板向左或向右移动。 当用户单击一个按钮时,MainPanel类中的一个动作监听器会更改称为“PadderPosition”的桨类中的常量,然后调用“repaint()”。 然而,它不起作用,桨也不动。我知道按钮工作正常,因为它会输出“Hello World”和paddlePosition的值,但很明显,重新绘制时出了问题。 到目前为止,我正在使用Swing、JFrame和Graphics2D使

我正在尝试创建简单的乒乓球游戏。 我正在做的第一件事是,当用户单击框架中提供的“左”或“右”按钮时,让挡板向左或向右移动。 当用户单击一个按钮时,MainPanel类中的一个动作监听器会更改称为“PadderPosition”的桨类中的常量,然后调用“repaint()”。 然而,它不起作用,桨也不动。我知道按钮工作正常,因为它会输出“Hello World”和paddlePosition的值,但很明显,重新绘制时出了问题。 到目前为止,我正在使用Swing、JFrame和Graphics2D使一切正常工作

我的班级:

乒乓架(跑步类)

主面板:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MainPanel extends JPanel implements ActionListener{

    public Paddle paddle;

    public MainPanel(){

        setSize(300, 300);
        paddle = new Paddle();
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2 = (Graphics2D)g;
        paddle.draw(g2);
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("Hello World");
        Paddle.movePaddleLeft();
        System.out.println(Paddle.paddlePosition);
        this.repaint();
    }
}
按钮面板:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class ButtonPanel extends JPanel {


    private static final long serialVersionUID = 1L;

    public MainPanel mainPanelActionListener = new MainPanel(); 

    JButton left;
    JButton right;

    public ButtonPanel(){
        left = new JButton("Left");
        right = new JButton("Right");

        add(left);
        add(right);

        left.addActionListener(mainPanelActionListener);
        right.addActionListener(mainPanelActionListener);
    }
}
桨:

import java.awt.Graphics2D;

public class Paddle{

    public static int paddlePosition = 200;
    private java.awt.Rectangle paddle;
    private int centerCoordinateX;
    private int centerCoordinateY;

    public Paddle(){
        //paddle = new java.awt.Rectangle(paddlePosition, 285, 100, 10); // x, y, width, height
    }

    public void draw(Graphics2D g2){
        paddle = new java.awt.Rectangle(paddlePosition, 285, 100, 10);
        g2.draw(paddle);
    }

    public static void movePaddleLeft(){
        paddlePosition = (paddlePosition + 3);
    }
}

有人知道怎么回事吗?单击按钮时,挡板为什么不移动?

按钮面板中,您正在创建一个新的
主面板。这将导致您创建一个正在更新的新不可见面板

实际上,您需要做的是将
主面板
发送到它的构造函数中的
按钮面板


编辑:(免责声明:此处生成的所有代码都没有IDE)

PongFrame
构造函数中执行以下操作:

MainPanel mainPanel = new MainPanel();
ButtonPanel buttonPanel = new ButtonPanel(mainPanel);
这将创建一个参照
主面板的
按钮面板

现在查看
按钮面板

public MainPanel mainPanelReference;

JButton left;
JButton right;

public ButtonPanel(MainPanel mainPanelReference) {
    this.left = new JButton("Left");
    this.right = new JButton("Right");

    add(left);
    add(right);

    this.mainPanelReference = mainPanelReference;

    left.addActionListener(mainPanelReference);
    right.addActionListener(mainPanelReference);
}

“您实际上需要做的是将主面板发送到其构造函数中的ButtonPanel。”您能详细说明一下吗?@Imray请检查此代码是否对您有帮助。我已经有一段时间没有使用java了,所以可能总是会有错误:)我建议您仔细阅读一下
static
的含义。无论何时使用,似乎都没有逻辑可言。例如,我不明白为什么要使用一个静态字段作为paddleposition,因为这样我就可以从类外更新它。有没有更好的方法?任何公共字段都可以在课外更新;另外,您不需要,只需要(非静态)moveLeft()和moveRight()。然后调用pable.moveLeft();这是在实例字段中划桨,而不是在类中划桨。
public MainPanel mainPanelReference;

JButton left;
JButton right;

public ButtonPanel(MainPanel mainPanelReference) {
    this.left = new JButton("Left");
    this.right = new JButton("Right");

    add(left);
    add(right);

    this.mainPanelReference = mainPanelReference;

    left.addActionListener(mainPanelReference);
    right.addActionListener(mainPanelReference);
}