Узел-потомок HBox / VBox не следует за перетаскиванием или странным образом движется - PullRequest
0 голосов
/ 12 мая 2018

Первый раз что-то спрашиваю здесь, извините за неправильный английский + Я здесь, потому что меня расстраивает поведение моего кода, которое не поможет моему английскому.

Используя javaFX (только с java, без FXML), я пытаюсь сделать Узел похожим на это

enter image description here

(Таким образом, умножает HBox в 2 VBox в одном HBox) И всякий раз, когда я перемещаю его (при перетаскивании), он перемещается по экрану, но если я использую ChangeListener для свойств дочернего элемента, я вижу, что они вообще не перемещаются в реальности (layoutX или translateX остаются при начальных значениях), что вызывает у меня много проблем, так как я хочу подключить ячейку узлов (и щелкать по вещам не очень весело).

И когда я попытался форсировать его, связав translateXProperty и все те вещи, которые оправдывает содержимое моего Node, и код говорит мне, что это то место, где он должен быть, но на экране это просто исчезло (см. Рис.)

enter image description here

(Существует только смещение значения X, потому что я использовал bind () только для translateX, чтобы показать проблему). Извините, это плохая картина, но я не знаю, как показать иначе, и я не думаю, что давать свой код было бы уместно, так как я уважал первую организацию изображений. Я пытался использовать Group, Pane и подклассы, но это не работает, и система HBox + VBox организовывает мой контент так, как я хочу.

Я смотрел на документ, и из-за моего английского должно быть что-то, чего я вообще не понимал, но хорошо, я не знаю, так что если у вас есть идеи, если возможно, где я могу сохранить это организация, спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Как некоторые люди спрашивают здесь, как это выглядит в коде, с некоторым Слушателем, чтобы увидеть, что контент не перемещается, и потому что мне нужно иметь возможность сделать связь между кругами HBox, мне нужно, чтобы они имели правильные значения перевода .

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {

    private double mouseX;
    private double mouseY;
    private double sourceX;
    private double sourceY;

    public static void main(String[] args)
    {
        launch(args);
    }

            @Override
    public void start(Stage primaryStage) throws Exception
    {
        HBox root = new HBox(10);

        // Making the first col (see first image)
        VBox left = new VBox(5
                , new HBox(10, new Circle(10, Color.WHEAT), new Rectangle(50, 20, Color.CORAL))
                , new HBox(10, new Circle(10, Color.WHEAT), new Rectangle(50, 20, Color.CORAL))
        );

        // Making the second col (see first image)

        VBox right = new VBox(5);
        right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("right VBox " +
                "translate to " + newValue)); // Isn't called
        root.getChildren().add(right);

        // Making the first row of the right col (see first image)
        HBox row0Right = new HBox(10);
        row0Right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("row0Right " +
                "HBox translate to " + newValue)); // Isn't called
        row0Right.getChildren().add(new Rectangle(50, 20, Color.CYAN));
        // Making a Circle with a translate Listener
        Circle circle = new Circle(10, Color.CRIMSON);
        circle.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("circle " +
                "row0col1 translate to " + newValue)); // Isn't called
        row0Right.getChildren().add(circle);

        // Making the second row of the right col (see first image)
        HBox row1Right = new HBox(10);
        row1Right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("row1Right " +
                "HBox translate to " + newValue)); // Isn't called
        row1Right.getChildren().add(new Rectangle(50, 20, Color.CYAN));
        row1Right.getChildren().add(new Circle(10, Color.CRIMSON));
        right.getChildren().addAll(row0Right, row1Right);

        root.setOnMousePressed(event ->
        {
            mouseX = event.getSceneX();
            mouseY = event.getSceneY();
            sourceX = ((Node) (event.getSource())).getTranslateX();
            sourceY = ((Node) (event.getSource())).getTranslateY();
        });

        root.setOnMouseDragged(event ->
        {
            double newX = sourceX + event.getSceneX() - mouseX;
            double newY = sourceY + event.getSceneY() - mouseY;
            ((Node) (event.getSource())).setTranslateX(newX);
            ((Node) (event.getSource())).setTranslateY(newY);
        });

        root.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("root translate " +
                "to " + newValue)); // Is the only one called

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 720, 720));
        primaryStage.show();
    }
}

РЕДАКТИРОВАТЬ 2: Я заметил, что если я использую Rectangle в качестве движущегося корня, и формы связывания преобразуются в него, все в порядке, но я предпочитаю, как HBox / VBox размещает детей, так как я не хочу устанавливать каждый пиксель в x, y, ширина и высота для каждой фигуры, связанной с моим основным прямоугольником (который может стать большим количеством фигур), когда я могу использовать этот шаблон Box.

...