HBox / VBox的节点子节点没有拖拽或以奇怪的方式移动

时间:2018-05-12 00:27:29

标签: java javafx javafx-8

第一次在这里问一些事情,抱歉我的英语不好+我在这里,因为我对代码的行为感到不安,这对我的英语没有帮助。

使用javaFX(仅限java,没有FXML)我试图让Node看起来像这样

enter image description here

(因此在一个HBox中将HBox与2个VBox相乘) 每当我移动它(在Drag上)时,它会在屏幕上移动,但是如果我在子项的属性上使用ChangeListener,我可以看到它们实际上根本没有移动(layoutX或translateX保持在起始值),这导致我很多麻烦,因为我想连接节点的单元格(点击不存在的东西非常有趣)。

当我试图通过绑定translateXProperty和所有那些东西强制它时,我的Node的内容juste消失了,代码告诉我它应该是它的位置,但是在屏幕上它已经消失了(见图片)

enter image description here

(X值只有一个偏移,因为我只在translateX上使用bind()来显示问题)。 对不起,这是一些不好的油漆,但我不知道如何显示,我不认为给我的代码是相关的,因为我尊重第一个图片组织。我尝试过使用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中设置每个px, y,当我可以使用那些Box模式时,每个形状的宽度和高度都会绑定到我的核心矩形(可能会变成很多形状)。

0 个答案:

没有答案