在 canvas 内画线
Draw line inside canvas
我想使用 java 在 canvas 内画一条线。如果我在 g.drawLine 中使用常数值,下面的程序运行良好。当前代码正在绘制 canvas 没有线条。
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() {
}
}
首先,您需要阅读 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
的工作方式,只有第二个实例会被布局,首先将被忽略。
同样,不知道为什么,只需添加第一个并完成它。
"works" 可能看起来像...
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
会给您带来更好的性能和结果
我想使用 java 在 canvas 内画一条线。如果我在 g.drawLine 中使用常数值,下面的程序运行良好。当前代码正在绘制 canvas 没有线条。
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() {
}
}
首先,您需要阅读 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
的工作方式,只有第二个实例会被布局,首先将被忽略。
同样,不知道为什么,只需添加第一个并完成它。
"works" 可能看起来像...
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
会给您带来更好的性能和结果