我正在使用Swing设计一个简单的乒乓球游戏。该游戏由5个.java文件实现 - PingPongApp.java是JVM的入口点,MainPanel.java是一个面板,用于组织2个子面板:一个按钮面板和一个屏幕面板(ScreenPanel.java),然后是Ball.java和Racket实现球和球拍逻辑的.java。我试图在屏幕面板上绘制球和球拍,但问题是,当我运行应用程序时,球是唯一被绘制的对象。这是我的代码:
Racket.java
import java.awt.*;
public class Racket{
public Racket(int x, int y, int width, int height){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public void draw(Graphics g){
g.setColor(Color.RED);
g.fillRect(x, y, width, height);
}
private int x, y, width, height;
}
Ball.java
import java.awt.*;
public class Ball{
public Ball(int x, int y, int velocityX, int velocityY){
this.x = x;
this.y = y;
this.velocityX = velocityX;
this.velocityY = velocityY;
}
public void setBounds(int width, int height){
rightBoundary = width - DIAMETER;
bottomBoundary = height - DIAMETER;
}
public void move(){
// Move the ball
}
public void draw(Graphics g){
g.fillOval(x, y, DIAMETER, DIAMETER)
}
private final static int DIAMETER = 21;
private int x, y, velocityX, velocityY, rightBoundary, bottomBoundary;
}
ScreenPanel.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class ScreenPanel extends JPanel{
public ScreenPanel(){
initComponents();
}
private void initComponents(){
interval = 35;
ball = new Ball(130, 0, 2, 3);
racket = new Racket(120, 250, 70, 10);
setPreferredSize(new Dimension(200, 200));
setBorder(BorderFactory.createLineBorder(Color.BLACK));
timer = new Timer(interval, new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
ball.setBounds(getWidth(), getHeight());
ball.move();
repaint();
}
});
}
public void paintComponent(Graphics g){
super.paintComponent(g);
ball.draw(g);
racket.draw(g);
}
public void startOrPauseGame(boolean turnOnOff){
if(turnOnOff){
timer.start();
} else {
timer.stop();
}
}
private Racket racket;
private Timer timer;
private Ball ball;
private int interval;
}
MainPanel.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class MainPanel extends JPanel{
public MainPanel(){
initComponents();
}
private void initComponents(){
buttonPanel = new JPanel(new FlowLayout());
screenPanel = new ScreenPanel();
cmdStart = new JButton("Start/Resume");
cmdPause = new JButton("Pause");
addComponentsToPane();
}
public void addComponentsToPane(){
buttonPanel.add(cmdStart);
buttonPanel.add(cmdPause);
setLayout(new BorderLayout());
add(buttonPanel , BorderLayout.NORTH);
add(screenPanel , BorderLayout.SOUTH);
cmdStart.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
// Start the game
}
});
cmdPause.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
// Pause the game
}
});
}
private ScreenPanel screenPanel;
private JPanel buttonPanel;
private JButton cmdStart, cmdPause;
}
答案 0 :(得分:3)
问题是你的球拍的 y 坐标大于面板ScreenPanel
的首选尺寸高度: - 250> 200:
racket = new Racket(120, 250, 70, 10);
^
setPreferredSize(new Dimension(200, 200));
让球拍脱离屏幕。
答案 1 :(得分:3)
这是我在ScreenPanel类
上的程序中找到的代码racket = new Racket(120, 250, 70, 10);
setPreferredSize(new Dimension(200, 200));
将其更改为您将获得的正确值。 Y是250,大小是200。