如何绘制箭头JavaFX? (窗格)
发布时间:2020-12-15 04:37:11 所属栏目:Java 来源:网络整理
导读:我需要从无向制作有向图.我可以绘制line-Edge,但我不知道如何制作箭头: public class Edge extends Group {protected Cell source;protected Cell target;Line line;public Edge(Cell source,Cell target) { this.source = source; this.target = target; s
我需要从无向制作有向图.我可以绘制line-Edge,但我不知道如何制作箭头:
public class Edge extends Group { protected Cell source; protected Cell target; Line line; public Edge(Cell source,Cell target) { this.source = source; this.target = target; source.addCellChild(target); target.addCellParent(source); line = new Line(); line.startXProperty().bind(source.layoutXProperty().add(source.getBoundsInParent().getWidth() / 2.0)); line.startYProperty().bind(source.layoutYProperty().add(source.getBoundsInParent().getHeight() / 2.0)); line.endXProperty().bind(target.layoutXProperty().add( target.getBoundsInParent().getWidth() / 2.0)); line.endYProperty().bind(target.layoutYProperty().add( target.getBoundsInParent().getHeight() / 2.0)); getChildren().addAll(line); } 解决方法
您需要再添加2条线来制作箭头(或者填充箭头的多边形具有相同的点).
注意,可以基于“主”连接的行结束的开始和结束之间的差异来确定箭头的方向.构成箭头的每条线的一端需要与主线的末端处于相同的坐标.另一端可以通过组合主线方向的一部分和一条与主线正交的部分来计算: public class Arrow extends Group { private final Line line; public Arrow() { this(new Line(),new Line(),new Line()); } private static final double arrowLength = 20; private static final double arrowWidth = 7; private Arrow(Line line,Line arrow1,Line arrow2) { super(line,arrow1,arrow2); this.line = line; InvalidationListener updater = o -> { double ex = getEndX(); double ey = getEndY(); double sx = getStartX(); double sy = getStartY(); arrow1.setEndX(ex); arrow1.setEndY(ey); arrow2.setEndX(ex); arrow2.setEndY(ey); if (ex == sx && ey == sy) { // arrow parts of length 0 arrow1.setStartX(ex); arrow1.setStartY(ey); arrow2.setStartX(ex); arrow2.setStartY(ey); } else { double factor = arrowLength / Math.hypot(sx-ex,sy-ey); double factorO = arrowWidth / Math.hypot(sx-ex,sy-ey); // part in direction of main line double dx = (sx - ex) * factor; double dy = (sy - ey) * factor; // part ortogonal to main line double ox = (sx - ex) * factorO; double oy = (sy - ey) * factorO; arrow1.setStartX(ex + dx - oy); arrow1.setStartY(ey + dy + ox); arrow2.setStartX(ex + dx + oy); arrow2.setStartY(ey + dy - ox); } }; // add updater to properties startXProperty().addListener(updater); startYProperty().addListener(updater); endXProperty().addListener(updater); endYProperty().addListener(updater); updater.invalidated(null); } // start/end properties public final void setStartX(double value) { line.setStartX(value); } public final double getStartX() { return line.getStartX(); } public final DoubleProperty startXProperty() { return line.startXProperty(); } public final void setStartY(double value) { line.setStartY(value); } public final double getStartY() { return line.getStartY(); } public final DoubleProperty startYProperty() { return line.startYProperty(); } public final void setEndX(double value) { line.setEndX(value); } public final double getEndX() { return line.getEndX(); } public final DoubleProperty endXProperty() { return line.endXProperty(); } public final void setEndY(double value) { line.setEndY(value); } public final double getEndY() { return line.getEndY(); } public final DoubleProperty endYProperty() { return line.endYProperty(); } } 使用 @Override public void start(Stage primaryStage) { Pane root = new Pane(); Arrow arrow = new Arrow(); root.getChildren().add(arrow); root.setOnMouseClicked(evt -> { switch (evt.getButton()) { case PRIMARY: // set pos of end with arrow head arrow.setEndX(evt.getX()); arrow.setEndY(evt.getY()); break; case SECONDARY: // set pos of end without arrow head arrow.setStartX(evt.getX()); arrow.setStartY(evt.getY()); break; } }); Scene scene = new Scene(root,400,400); primaryStage.setScene(scene); primaryStage.show(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Java EE FrontController与Spring的DispatcherServlet相同
- 如何把springboot jar项目 改为war项目
- java – 什么是Vector容量的目的
- java – Google Guava vs. Apache Commons
- Java Cucumber:从外部源获取@CucumberOptions,如属性文件
- 浅谈maven的jar包和war包区别 以及打包方法
- Java 同步锁(synchronized)详解及实例
- Struts2拦截器Interceptor的原理与配置实例详解
- java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序
- java web开发_购物车功能实现