当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中实现箭头形状?

司徒兴思
2023-03-14

我正在编写一个JavaFX应用程序,它需要绘制有向图。我想通过形状来实现这一点,因为我希望可以拖动顶点。我用一个圆来表示一个顶点,但是当我试图找到一个形状来表示有向边时,我遇到了一个问题。< br >有向边应该看起来像一个箭头,我的想法是用一条线和一个三角形来表示它。所以我扩展了javafx.scene.shape.Line类:

class Arrow extends Line {
    Polygon triangle;

    Arrow(double startX, double startY, double endX, double endY) {
        super(startX, startY, endX, endY);
        double dx = endX - startX;
        double dy = endY - startY;
        double angle = Math.atan2(dy, dx);
        triangle = new Polygon(endX, endY, endX - 8, endY + 4, endX - 8, endY - 4);
        triangle.setRotate(Math.toDegrees(angle));
        triangle.rotateProperty().bind()
            triangle.rotateProperty().bind(Bindings.createDoubleBinding(() -> { 
            double x = this.getEndX() - this.getStartX();
            double y = this.getEndY() - this.getStartY();
            double a = Math.atan2(y, x);
            return Math.toDegrees(a);
        }));
    }
}

由于顶点可以拖动,当然边缘应该同时移动,这意味着箭头内的三角形应该根据线条的属性移动和旋转。但是我还没有找到一种方法将Polygon的位置属性与Line的endXProperty和endYProperty绑定。
所以我想问一下如何实现这一点?或者有没有更好的方法通过形状实现可移动的箭头(有向边缘)?

共有2个答案

堵飞鸿
2023-03-14

如果您要将ChangeListeners添加到endX和endY Property并在change方法中重新定位三角形,那么您可以使用Line移动三角形。

昌招
2023-03-14

我正在寻找一个和你一样的箭头,它在数学上是正确的,但需要一些编程的东西,我创建了dx和dy作为属性,并为它们添加了一个监听器,并为三角形创建了一个“旋转”。它的工作完美,但你可以绑定其他属性,如填充,颜色等..

import javafx.beans.binding.DoubleBinding;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polygon;
import javafx.scene.transform.Rotate;

public class Arrow extends Line {

private Polygon triangle;
private Pane Parent;


public Arrow(Pane Parent) {
    this.Parent = Parent;
    Parent.getChildren().addAll(this);
    canvas();
}

private DoubleBinding dx;
private DoubleBinding dy;

private void canvas(){
    dx = endXProperty().add(startXProperty().negate());
    dy = endYProperty().add(startYProperty().negate());
    triangle = new Polygon(getEndX(), getEndY(), getEndX() - 16, getEndY() + 8, getEndX() - 16, getEndY() - 8);
    var rotate = new Rotate(0,0,0,1,Rotate.Z_AXIS);
    triangle.getTransforms().add(rotate);
    dx.addListener((observable, oldValue, newValue) -> {
        rotate.setAngle(getAngle(dy.doubleValue(), newValue.doubleValue()));
    });
    dy.addListener((observable, oldValue, newValue) -> {
        rotate.setAngle(getAngle(newValue.doubleValue(), dx.doubleValue()));
    });
    triangle.layoutXProperty().bind(endXProperty());
    triangle.layoutYProperty().bind(endYProperty());
    Parent.getChildren().add(triangle);
}

private double getAngle(double dy ,double dx){
    return Math.toDegrees(Math.atan2(dy, dx));
}

}
 类似资料:
  • 本文向大家介绍iOS实现圆角箭头矩形的提示框,包括了iOS实现圆角箭头矩形的提示框的使用技巧和注意事项,需要的朋友参考一下 先来看看我们见过的一些圆角箭头矩形的提示框效果图 一、了解CGContextRef 首先需要对 CGContextRef 了解, 作者有机会再进行下详细讲解, 这篇中简单介绍下, 方便后文阅读理解. 先了解 CGContextRef 坐标系 坐标系 举例说明 : 对于 商城类

  • 问题内容: 我刚接触Android,并且一直在研究Canvas。我正在尝试绘制箭头,但是在绘制轴时运气不好,没有一个箭头在起作用。 我进行了一些搜索,找到一个Java示例,但是Android没有or 。 现在,我的代码如下所示(箭头看上去完全不像箭头): 我查看了以下线程以获取指导: * http://www.java-forums.org/awt-swing/6241-how-u-rotate-

  • 问题内容: 所有四个箭头键(左上右下)的utf8代码是什么? 我正在学习node.js,并且试图检测何时按下了这些键。 这是我的工作,但是没有一个能捕获箭头键…我是node.js的新手,所以我在这里可能做得很愚蠢。 谢谢。 问题答案: 您可以使用按键包。尝试页面上给出的示例。 您可以按顺序获取箭头键的UTF-8值。

  • 如何在按钮中显示向上箭头符号?分别,我希望它在单击向下箭头时发生更改。我该怎么做?? 我试过了,但是。。。。

  • 问题内容: 我正在尝试创建一个简单游戏的开始。我要做的第一件事是将图形导入到我的代码中,然后在屏幕上移动它。我能够在屏幕上画一个球并四处移动,但是当我从文件导入图形时,无法四处移动。我想念什么或做错什么? 我的司机是在另一个班级,如下所示: 问题答案: 这里有两个大问题: 您正在从中读取文件。 永远 不要这样做,因为这会不必要地减慢绘图速度。可能在构造函数中读取一次图像,然后在图形中使用存储的im

  • 问题内容: 如何仅在CSS中制作此箭头? 我正在建立一个类似向导的订购过程,该菜单具有以下菜单: 活动页面显示为绿色(在本例中为Model)。 如何仅使用CSS制作此箭头? 目前,我通过使用多个div和图像来实现自己的目标: 我找到了一个能做到这一点的SO答案: CSS的Arrow Box,但是我在左侧的缩进方面遇到了麻烦。 如果您对如何执行此操作有更好的想法,请告诉我! 问题答案: 如果箭头之间