javaswing绘制箭头
时间: 2023-11-21 15:54:38 浏览: 43
在Java Swing中绘制箭头可以通过创建Arrow类和LineArrow、CurvedArrow子类来实现。可以使用Graphics2D类的draw方法来绘制箭头。
下面是一个简单的示例代码,用于在Java Swing中绘制箭头:
```java
public abstract class Arrow {
public abstract void draw(Graphics2D g, int x1, int y1, int x2, int y2);
}
public class LineArrow extends Arrow {
public void draw(Graphics2D g, int x1, int y1, int x2, int y2) {
g.drawLine(x1, y1, x2, y2);
drawArrow(g, x1, y1, x2, y2);
}
private void drawArrow(Graphics2D g, int x1, int y1, int x2, int y2) {
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = 10;
int x = (int) (x2 - len * Math.cos(angle));
int y = (int) (y2 - len * Math.sin(angle));
g.drawLine(x2, y2, x, y);
x = (int) (x2 - len * Math.cos(angle - Math.PI / 8));
y = (int) (y2 - len * Math.sin(angle - Math.PI / 8));
g.drawLine(x2, y2, x, y);
x = (int) (x2 - len * Math.cos(angle + Math.PI / 8));
y = (int) (y2 - len * Math.sin(angle + Math.PI / 8));
g.drawLine(x2, y2, x, y);
}
}
public class CurvedArrow extends Arrow {
public void draw(Graphics2D g, int x1, int y1, int x2, int y2) {
QuadCurve2D.Double curve = new QuadCurve2D.Double();
curve.setCurve(x1, y1, (x1 + x2) / 2, (y1 + y2) / 2, x2, y2);
g.draw(curve);
drawArrow(g, x1, y1, (x1 + x2) / 2, (y1 + y2) / 2);
}
private void drawArrow(Graphics2D g, int x1, int y1, int x2, int y2) {
double dx = x2 - x1, dy = y2 - y1;
double angle = Math.atan2(dy, dx);
int len = 10;
int x = (int) (x2 - len * Math.cos(angle));
int y = (int) (y2 - len * Math.sin(angle));
g.drawLine(x2, y2, x, y);
x = (int) (x2 - len * Math.cos(angle - Math.PI / 8));
y = (int) (y2 - len * Math.sin(angle - Math.PI / 8));
g.drawLine(x2, y2, x, y);
x = (int) (x2 - len * Math.cos(angle + Math.PI / 8));
y = (int) (y2 - len * Math.sin(angle + Math.PI / 8));
g.drawLine(x2, y2, x, y);
}
}
public class ArrowTest extends JPanel {
private Arrow[] arrows = { new LineArrow(), new CurvedArrow() };
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int width = getWidth();
int height = getHeight();
for (int i = 0; i < arrows.length; i++) {
arrows[i].draw(g2, 0, i * height / arrows.length, width, (i + 1) * height / arrows.length);
}
}
}
```
在上面的代码中,Arrow是一个抽象类,它有一个抽象方法draw,用于绘制箭头。LineArrow和CurvedArrow是Arrow的两个子类,分别用于绘制直线箭头和曲线箭头。在draw方法中,先使用Graphics2D的drawLine方法绘制线条,然后调用drawArrow方法绘制箭头。
在ArrowTest类中,创建了一个Arrow数组,包含了LineArrow和CurvedArrow两个实例。在paintComponent方法中,遍历Arrow数组,调用draw方法绘制箭头。