首先,你需要去阅读 在AWT和Swing中绘画 更好地了解Swing和AWT中绘画的工作原理。
接下来,你需要仔细阅读 JavaDocs for Canvas 更好地了解您可以覆盖的功能。
Canvas
要理解的一个难点概念是,你实际上并没有控制绘画系统,它是为你照顾的(它就像黑魔法),你只需要使用它,通过重写适当的方法并与API交互在需要时请求更新。
您的代码最大的问题是 public void paint(Graphics g, Drawing d) { 。没有什么可以称之为,因为它不是油漆系统识别的方法。它也质疑为什么你需要传递一个参考 Drawing 到一个实例 Drawing ,不确定这一切。
public void paint(Graphics g, Drawing d) {
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 工作,只有第二个将被布局,第一个将被忽略。
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创建GUI 。你也会发现使用类似的东西 JPanel 代替 Canvas 会给你更好的表现和结果
JPanel