Нарисуйте линию внутри холста - PullRequest
0 голосов
/ 15 января 2019

Я хочу нарисовать линию внутри холста, используя 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 голосов
/ 16 января 2019

Сначала вам нужно прочитать Рисование в AWT и Swing , чтобы лучше понять, как рисование работает в Swing и AWT.

Далее вам нужно прочитать JavaDocs для 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, и я настоятельно рекомендую вам потратить некоторое время на чтение Создание графического интерфейса с JFC / Swing . Вы также обнаружите, что использование что-то вроде JPanel вместо Canvas даст вам лучшую производительность и результаты

...