Добавить узел в середине строки java fx - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть строка, и я хочу, чтобы квадрат с текстом внутри квадрата был помещен в середине этой строки.

Я создал квадрат с текстом, используя панель стека.Эта линия перетаскивается, поэтому я хочу, чтобы квадрат оставался в середине этой строки при перетаскивании.

Я пытался:

weightSquare.layoutXProperty().bind((line.startXProperty().add(line.endXProperty())).divide(2).add(line.translateXProperty()));
weightSquare.layoutYProperty().bind((line.startYProperty().add(line.endYProperty())).divide(2).add(line.translateXProperty()));

где weightSquare - это StackPane, содержащий прямоугольник иtext.

В настоящее время weightSquare находится ближе к середине строки, но не совсем в середине.Когда линия перемещается вокруг элемента weightSquare, он остается относительно близко к середине строки, но иногда слегка сходит с линии.

Я хочу что-то вроде этого:

Пример того, что я хочу

Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Предполагая, что никакие преобразования не были применены к линии или StackPane, вы можете вычислить положение StackPane на основе свойств линии, подобных этому

stackPane.layoutX = (line.startX + line.endX - stackPane.width) / 2;

(Выполните соответствующие действия для координат y.)

transformX и transformY могут быть просто добавлены, но для общих преобразований потребуется

  1. Прослушивание изменений преобразований
  2. Используйте localToParent в начальных / конечных координатах линии, чтобы получить местоположение в родительском элементе.

Я рекомендую использовать Bindings.createDoubleBindings для сложных двойных привязок, кстати, так как это значительно упрощает чтение формулы вычисления значений.

* ** 1 022 тысяча двадцать-один * Пример

Я использую Label, так как это также обеспечивает функциональность фона / границы.

@Override
public void start(Stage primaryStage) throws IOException {
    Label label = new Label();
    label.setStyle("-fx-background-color: white; -fx-border-color: black;");
    label.setPadding(new Insets(2, 4, 2, 4));

    Line line = new Line(300, 300, 300, 100);

    label.layoutXProperty().bind(Bindings.createDoubleBinding(
            () -> (line.getStartX() + line.getEndX() - label.getWidth()) / 2,
            line.startXProperty(), line.endXProperty(), label.widthProperty()));
    label.layoutYProperty().bind(Bindings.createDoubleBinding(
            () -> (line.getStartY() + line.getEndY() - label.getHeight()) / 2,
            line.startYProperty(), line.endYProperty(), label.heightProperty()));

    DoubleProperty angle = new SimpleDoubleProperty();
    line.endXProperty().bind(Bindings.createDoubleBinding(() -> 300 + 200 * Math.sin(angle.get()), angle));
    line.endYProperty().bind(Bindings.createDoubleBinding(() -> 300 + 200 * Math.cos(angle.get()), angle));

    Timeline timeline = new Timeline(
            new KeyFrame(Duration.ZERO, new KeyValue(angle, 0d, Interpolator.LINEAR)),
            new KeyFrame(Duration.seconds(10), new KeyValue(angle, Math.PI * 2, Interpolator.LINEAR)));
    timeline.setCycleCount(Animation.INDEFINITE);
    label.textProperty().bind(timeline.currentTimeProperty().asString());
    timeline.play();

    Scene scene = new Scene(new Pane(line, label), 600, 600);

    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...