在画布内画线

时间:2019-01-15 19:51:33

标签: java swing graphics awt

我想使用Java在画布内画一条线。如果我在g.drawLine中使用常量值,则以下程序运行良好。当前代码是绘制没有线条的画布。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Drawing extends Canvas {
    int x1;
    int y1;
    int x2;
    int y2;

    public static void main(String[] args) {

        Drawing dr = new Drawing(100, 100, 200, 200);
        JFrame frame = new JFrame("My Drawing");
        Canvas canvas = new Drawing();
        canvas.setSize(400, 400);
        canvas.setBackground(Color.white);

        frame.add(dr);

        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
    }

    public void paint(Graphics g, Drawing d) {
        super.paint(g);
        g.drawLine(d.x1, d.y1, d.x2, d.y2);

    }

    Drawing(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }

    Drawing() {

    }
}

1 个答案:

答案 0 :(得分:1)

首先,您需要阅读Painting in AWT and Swing,以更好地了解绘画在Swing和AWT中的工作方式。

接下来,您需要通读JavaDocs for Canvas,以更好地了解可以覆盖的功能。

一个难以理解的概念是,您实际上并没有控制绘画系统,而是由您自己来照顾(就像黑魔法一样),您只需要通过覆盖适当的方法并进行交互就可以使用它。使用API​​来在需要时请求更新。

您的代码最大的问题是public void paint(Graphics g, Drawing d) {。没什么可称呼它的,因为它不是绘画系统可以识别的方法。还会引起疑问,为什么您需要将Drawing的引用传递给Drawing的实例,而不是全部确定。

您遇到的另一个问题是...

Drawing dr = new Drawing(100, 100, 200, 200);
JFrame frame = new JFrame("My Drawing");
Canvas canvas = new Drawing();
canvas.setBackground(Color.white);

frame.add(dr);

frame.add(canvas);

您要向Drawing添加两个JFrame实例,因为默认BorderLayout的工作方式,只有第二个实例会被布局,第一个实例会被布局。被忽略。

同样,不确定为什么,只需添加第一个并完成操作即可。

“有效”的内容可能类似于...

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Drawing extends Canvas {

    int x1;
    int y1;
    int x2;
    int y2;

    public static void main(String[] args) {

        Drawing dr = new Drawing(100, 100, 200, 200);
        JFrame frame = new JFrame("My Drawing");
        frame.add(dr);
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 400);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawLine(x1, y1, x2, y2);
    }

    Drawing(int x1, int y1, int x2, int y2) {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }

    Drawing() {

    }
}

您似乎在使用API​​时犯了根本性的错误,我强烈建议您花一些时间来阅读Creating a GUI With JFC/Swing。您还会发现,使用类似JPanel而不是Canvas的方法会给您带来更好的性能和结果