在java中绘制线条

时间:2016-06-24 16:04:27

标签: java swing awt

我已尝试使用此代码绘制一条线,但效果很好。

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

public class New extends JFrame {
    public New() {
        setSize(960, 960);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {
        g.drawLine(0, 480, 960, 480);
    }

    public static void main(String[] args) {
        New n = new New();
    }
}

我还尝试使用以下代码绘制一条线,但框架中没有显示任何线条。

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

public class Test {
    public Test() {
        JFrame f = new JFrame("Test");
        f.setSize(960, 960);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public void paint(Graphics g) {
        g.drawLine(0, 480, 960, 480);
    }

    public static void main(String []args) {
        Test t = new Test();
    }
}

我认为这两个片段没有区别。我错了吗?有什么区别,它是什么?

3 个答案:

答案 0 :(得分:2)

JFrame在构造函数中声明,这意味着它将在Test创建后删除。此外,paint方法不属于JFrame,但属于Test。所以它不会被称为。

答案 1 :(得分:1)

这是因为永远不会在第二个代码段中调用方法paint(Graphics)

确实在第一个代码段中,您使您的类扩展JFrame这是Container的子类,它提供此方法,以便您覆盖内部调用的方法paint(Graphics)当窗口显示时。

在第二个代码段中,它永远不会被调用,因此您的行永远不会显示。您应该创建自己的JFrame实现,在其中覆盖paint方法,然后在类Test的构造函数中使用它。

NB: f不应该是构造函数中的局部变量,它应该是类Test中的一个字段,以防止很难找到错误。

答案 2 :(得分:0)

在您的第一个代码上继承msinfo32类的paint()方法。

在您的第二个代码中,您创建了一个名为JFrame的方法,但它不是Window#paint(),而是一个新方法。

如果您想要相同的输出,请按如下方式编辑代码:

paint()