在JPanel上绘制一个矩形

时间:2012-08-11 10:33:51

标签: java swing drawing jpanel paintcomponent

我正在使用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;
}

2 个答案:

答案 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。