【问题标题】:AWT: I am trying to learn Java and was unable to understand the following programAWT:我正在尝试学习 Java,但无法理解以下程序
【发布时间】:2019-03-05 19:17:58
【问题描述】:
  1. 什么是 f.add(new MyCanvas()) 中的“new MyCanvas()”;
  2. 即使在 CanvasExample 类构造函数或 main() 方法中都没有调用 paint() 方法,我们如何获得椭圆形
  3. main() 方法中的新 CanvasExample() 是什么

import java.awt.*;

public class CanvasExample {  
    public CanvasExample() {  
        Frame f = new Frame("Canvas Example");  
        f.add(new MyCanvas());  
        f.setLayout(null);  
        f.setSize(400, 400);  
        f.setVisible(true);  
    }  

    public static void main(String args[]) {  
        new CanvasExample();
    }  
}  

class MyCanvas extends Canvas {  
    public MyCanvas() {  
        setBackground (Color.GRAY);  
        setSize(300, 200);  
    }

    public void paint(Graphics g){  
        g.setColor(Color.red);  
        g.fillOval(75, 75, 150, 75);  
    } 
}

请解释

【问题讨论】:

  • new 用于在 java 中创建类的对象。 paint() 看起来像一个回调。谷歌这些术语以了解更多信息。
  • @NicholasK 谢谢....我会这样做的。

标签: java object canvas components awt


【解决方案1】:
  1. 这是Canvas 类的一个实例。在 Java 中,new 是用于创建对象(给定类的实例)的关键字。话虽如此 - new Canvas() 创建 Canvas 类的新实例。类名后的括号表示构造函数 - 当您想要创建给定类型的对象时调用的代码块。

  2. 你得到了椭圆形,因为 paint 方法被调用了。它只是没有从您的代码中显式调用。正如您在this tutorial article published by Oracle 中所读到的,paint 方法将始终被触发为所谓的“回调机制”。该方法属于Container 类。我建议阅读docs about itMyCanvas 类中的 paint 方法覆盖了来自 Canvaspaint 方法。在扩展 Canvas 类并覆盖 paint 方法时,您应该始终在方法的开头调用超级方法。您可以在我已经包含在这一点中的链接中阅读原因。

  3. 如第 1 点 - new CanvasExample() 创建 MyCanvas 类的新实例。更具体地说,它调用构造函数 (public CanvasExample() { ... })。在您提供的代码中, CanvasExample 的构造函数创建 Frame 类型的新对象并调用其中的一些方法。其中一种方法是add,它是由类Frame 从其超类-Container 继承的。
    正如Java awt API 解释的那样,add 方法:

    将指定的组件附加到此容器的末尾。

【讨论】:

    【解决方案2】:

    希望你能理解 :D

    起初它调用public static void main(String args[])
    然后main 创建类CanvasExample 的新实例并调用其构造函数CanvasExample()

    该构造函数创建名为“f”的类 Frame 的新实例并调用类 Frame 的构造函数,它将该框架的标题设置为“画布示例”
    在构造函数CanvasExample() 的下一行中,它创建并将类MyCanvas 的新实例添加到名为“f”的Frame 实例中
    第三行构造函数CanvasExample() 它只是将“f”的布局设置为@987654331 @
    第四行构造函数CanvasExample() 它将“f”的大小设置为 400x400
    第五行构造函数CanvasExample() 它只是在屏幕上显示“f”(这样你就可以看到它)
    和构造函数的结尾CanvasExample() 它返回到main

    当创建类 MyCanvas 的新实例时,它的构造函数被称为它的构造函数,并且该构造函数将它的背景设置为“Color.GRAY”和大小它到 300x200 和所有 MyCanvas() 构造函数

    每次需要再次渲染“f”时,它都会调用MyCanvas类实例的方法paint(Graphics g),该实例小于“f”,因此您可以在后面看到白色
    那个白色是“f”的背景

    我想这就是你所要求的。
    祝你有美好的一天

    【讨论】:

    • 实例应该有变量吗?例如。 CanvasExample c = 新的 CanvasExample
    猜你喜欢
    • 2016-11-13
    • 2022-11-17
    • 2018-07-05
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多