Сначала вам нужно прочитать Рисование в 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
даст вам лучшую производительность и результаты