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