试图理解Java游戏设计代码

试图理解Java游戏设计代码,java,graphics,Java,Graphics,我正在尝试用Java学习游戏设计,我正在学习一个教程。本教程给出了这段代码,但没有详细说明。我有一些关于Java和图形的问题 import java.awt.*; import javax.swing.JFrame; import javax.swing.JPanel; @SuppressWarnings("serial") public class Game2 extends JPanel { @Override public void paint(Gr

我正在尝试用Java学习游戏设计,我正在学习一个教程。本教程给出了这段代码,但没有详细说明。我有一些关于Java和图形的问题

import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game2 extends JPanel {

    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fillOval(0, 0, 30, 30);
        g2d.drawOval(0, 50, 30, 30);        
        g2d.fillRect(50, 0, 30, 30);
        g2d.drawRect(50, 50, 30, 30);
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("Mini Tennis");
        frame.add(new Game2());
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
为什么我们需要将JPanel扩展到Game2类中?我从未在我的主类上使用过extends,所以我不确定它在本例中的含义以及为什么有必要使用它

什么是
frame.add(新游戏2())平均值?为什么允许我们在Game2()类中创建新的Game2()

什么是图形和图形2D对象?我们也不能只使用Graphics2D对象作为paint()的参数,因为我们从未在类型转换之外使用g将其转换为Graphics2D对象

最后,为什么我们不需要调用paint()?

您可以(几乎)扩展您喜欢的任何组件。这里最关键的一点是将组件放在一个
JFrame
上,这使它成为新窗口的基础。使用
JPanel
很好,因为它不包含图形,因此可以用作普通画布

frame.add(newgame2())
将要扩展的
JPanel
放入
JFrame

只要类实例在给定范围内可见,就可以在任何地方自由创建它们

每当底层操作系统决定是时候重新绘制组件时(例如,在显示窗口或在组件上拖动另一个窗口时),
Graphics2D
类的实例将自动传递给
paint()
方法

参数的类型始终为
Graphics
(这意味着该值可以是相同的类型,也可以是扩展它的任何类)。这是由方法的定义给出的(意味着一些父类或接口这样声明),您不能更改它

在开始任何更复杂的工作之前,请花一些时间熟悉面向对象编程的基础知识:


你不需要“需要”任何东西。它可以在包含主方法的类之外的类中完美地完成。如果您不知道这意味着什么,我建议您在尝试编写游戏或其他GUI应用程序之前先学习Java和OOP的基础知识。不建议调用paint()。我建议您针对使用的每个新类查看在线JavaDoc。这是官方文件。在Swing中,建议您替代paintComponent()。弱标题。重写以总结您的具体技术问题。