0

我在网上找到了这段代码,它适用于我的应用程序。我正在尝试更彻底地追踪和理解它。我没有找到任何解释使用“add(new Surface());”的文档 陈述。我明白它的作用,但这是我不明白的:

  • add() 方法如何在没有“SomeObject”的情况下工作。在它面前。似乎假设 add() 方法适用于包含它的对象 (SampleAddMethod)。我找不到任何关于如何或何时有效的文档。
  • 为什么“super.add(new Surface()); 有效,但“"SampleAddMethod.add(new Surface());" 失败?似乎 add() 方法是从 Component 继承的,并且 SampleAddMethod 是一个 JFrame ,它是一个组件。
  • 我是否正确 (new Surface()) 创建了一个“匿名类”?

(下面的示例代码)

package testMainMethod;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class Surface extends JPanel {

    private void doDrawing(Graphics g, int x) {
        double xd = (double) x;
        Graphics2D g2d = (Graphics2D) g;

        // Code to draw line image goes here
    }

    @Override
    public void paintComponent(Graphics g) {

        for (int i = 0; i < 512; i++) {
            // super.paintComponent(g); // this erases each line
            doDrawing(g, i);
        }
    }
}

public class SampleAddMethod extends JFrame {

    public SampleAddMethod() {

        initUI();
    }

    private void initUI() {

        setTitle("Lines");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new Surface());

        setSize(650, 350);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {

                SampleAddMethod lines = new SampleAddMethod();
                lines.setVisible(true);
            }
        });
    }

}
4

1 回答 1

1

为什么“super.add(new Surface()); 有效,但“"SampleAddMethod.add(new Surface());" 失败?

因为add(Component)Container, 基本上的实例方法 - 并且SampleAddMethodContainer, 间接的子类。所以add调用initUI是隐式的this.add(new Surface())。您不能将其称为SampleAddMethod.add因为只有当它是静态方法时才有效。

我是否正确 (new Surface()) 创建了一个“匿名类”?

不,它只是调用构造函数。代码等价于:

Surface surface = new Surface();
add(surface);

您向我们展示的代码中唯一的匿名类型是 in main,它在其中创建了一个新的匿名类来实现Runnable.

于 2013-10-18T16:24:09.870 回答