java - 在 JPanel 上绘制一个矩形

标签 java swing drawing jpanel paintcomponent

我正在使用 Swing 设计一个简单的乒乓球游戏。该游戏由 5 个 .java 文件实现——PingPongApp.java 是 JVM 的入口点,MainPanel.java 是一个包含 2 个子面板的面板:一个按钮面板和一个屏幕面板 (ScreenPanel.java),然后是 Ball.java 和 Racket .java 实现了球和 Racket 的逻辑。我试图在屏幕面板上同时绘制球和 Racket ,但问题是不知何故,当我运行该应用程序时,球是唯一绘制的对象。这是我的代码:

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

球.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;
}

屏幕面板.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;
}

主面板.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;
}

最佳答案

问题是您的 Racket 的 y 坐标大于面板 ScreenPanel 的首选尺寸高度:- 250 > 200:

    racket = new Racket(120, 250, 70, 10);
                              ^
    setPreferredSize(new Dimension(200, 200));

让 Racket 离屏。

关于java - 在 JPanel 上绘制一个矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11913923/

相关文章:

math - 给定空间中的一个点和一个向量,画一条 X 长的线

android - 易于理解的复杂颜色选择器

java - 使用 GZIP 配置 Tomcat 8

java - ResultSet 关闭后不允许操作(mysql,java)

java - 将 Bing JSON 转换为 Java

java: JTextField 的默认文档总是 PlainDocument 吗?

java - Swing:自定义 JSpinner 模型导致 StackOverflowError

Java ArrayList<GenericObject>.remove(GenericObject) 返回 false,但仍减少 ArrayList 的大小

java - 在 Java Swing 中取消选择单选按钮

java - 如何使用 GeneralPath 绘制两条平行线