【问题标题】:Draw line inside canvas在画布内画线
【发布时间】:2019-06-09 21:10:41
【问题描述】:

我想使用 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() {

    }
}

【问题讨论】:

  • 你怎么画一条线?在画布上的 (x,y) 位置按下鼠标按钮。按住按钮并移动到任何新位置 (x1,y1)。释放一个按钮。在 (x,y) 和 (x1,y1) 之间创建线。现在你更清楚一点了吗?
  • 感谢您的快速回复。
  • 感谢您的快速回复。在paint方法中,我传递了绘图对象,这样我就可以传递x1,y1,x2,y2的值了。油漆(图形 g,绘图 d)。实际上,我想在画布内绘制线条并传递线条坐标值。作为参数
  • 好的,有点复杂但仍然很简单。为此,您需要四个文本字段,分别用于 (x,y) 和 (x1,y1) 位置。和一个按钮。一旦按下按钮,它将使用文本字段中提供的值绘制一条线。

标签: java swing graphics awt


【解决方案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 会给您带来更好的性能和结果

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多