gpt4 book ai didi

java - 在JavaFX中用路径绑定(bind)两个圆

转载 作者:行者123 更新时间:2023-11-30 02:11:57 26 4
gpt4 key购买 nike

我想使用 Path 将两个圆与自由形式的线条绑定(bind)在一起(通过在元素中添加几个 LineTo 对象)。

我不知道如何在 Path 的情况下使用属性绑定(bind)。此外,我想通过点击它来改变它的颜色。

下面是它的外观示例。

我需要的示例

Example of what I need

编辑:

每个顶点都可以通过setOnMouseDragged移动,因此我需要保持连接到顶点的每个自由形式的线。

最佳答案

只需将第一个 MoveTo 和最后一个 LineToxy 属性绑定(bind)到 centerXcenterY 坐标路径开始/结束的位置。

private Path constructionPath = null;
private final Map<Color, Color> nextColor;

{
// create map for modifying color
nextColor = new HashMap<>();
Color[] colors = new Color[] { Color.BLACK, Color.RED, Color.GREEN, Color.BLUE };
for (int i = 0; i < colors.length - 1; i++) {
nextColor.put(colors[i], colors[i+1]);
}
nextColor.put(colors[colors.length-1], colors[0]);
}

private void createCircle(MouseEvent evt, Pane canvas) {
Circle circle = new Circle(evt.getX(), evt.getY(), 5, Color.WHITE);
circle.setStroke(Color.BLACK);
circle.setStrokeWidth(2.5);

// circle dragging events
class DragListener implements EventHandler<MouseEvent> {

boolean dragging;
double startX;
double startY;

@Override
public void handle(MouseEvent event) {
Point2D pt = circle.localToParent(event.getX(), event.getY());
circle.setCenterX(pt.getX() + startX);
circle.setCenterY(pt.getY() + startY);
dragging = true;
}
}
DragListener listener = new DragListener();
circle.setOnMousePressed(event -> {
if (event.getButton() == MouseButton.PRIMARY) {
Point2D pt = circle.localToParent(event.getX(), event.getY());
listener.startX = circle.getCenterX() - pt.getX();
listener.startY = circle.getCenterY() - pt.getY();
}
});
circle.setOnMouseReleased(event -> {
if (event.getButton() == MouseButton.PRIMARY) {
event.consume();
if (listener.dragging) {
listener.dragging = false;
} else {
if (constructionPath == null) {
// start new path
MoveTo move = new MoveTo();
move.xProperty().bind(circle.centerXProperty());
move.yProperty().bind(circle.centerYProperty());
constructionPath = new Path(move);
constructionPath.setStrokeWidth(2.5);
constructionPath.setOnMouseReleased(evt2 -> {
evt2.consume();
Path p = (Path) evt2.getSource();
p.setStroke(nextColor.get(p.getStroke()));
});
canvas.getChildren().add(0, constructionPath);
} else {
// end path
LineTo line = new LineTo();
constructionPath.getElements().add(line);
line.xProperty().bind(circle.centerXProperty());
line.yProperty().bind(circle.centerYProperty());
constructionPath = null;
}
}
}
});
circle.setOnMouseDragged(listener);

canvas.getChildren().add(circle);
}
Pane canvas = new Pane();
canvas.setOnMouseReleased(evt -> {
if (evt.getButton() == MouseButton.PRIMARY) {
if (constructionPath == null) {
// create Circle
createCircle(evt, canvas);
} else {
// add line to path
LineTo line = new LineTo(evt.getX(), evt.getY());
constructionPath.getElements().add(line);
}
}
});

canvas.setPrefSize(500, 500);

注意:点击路径很容易错过。如果您想增加用户可以单击的区域,您应该在 canvas PanemouseReleased 事件处理程序中进行自定义检查。

关于java - 在JavaFX中用路径绑定(bind)两个圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49798412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com