在HBox和VBox中布置的形状之间绘制线条

时间:2014-03-28 12:10:55

标签: javafx

我在各种容器(ScrollPane,Group,HBox和VBox)中都有一个圆圈

我想画一条从0,0到圆心的线。

我认为下面的代码显示了问题。我不知道应该去哪些功能 在//这里有一些代码可以在CIRCLE工作的地方工作

我编写了一个示例应用程序来简化我的问题。

import java.util.Random;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class TestAppForCoords extends Application {

    //Scene Graph:
    //ScrollPane - scroll
    // - Group - root
    //   - HBox - hbox - with random padding
    //     - VBox
    //     - VBox - vbox - with random padding
    //       - Circle - circle
    //     - VBox
    //   - Group - lines
    //     - Line - line


    @Override
    public void start(final Stage primaryStage) throws Exception {
        Random rand = new Random();
        int randomNum1 = rand.nextInt((100 - 0) + 1) + 0;
        int randomNum2 = rand.nextInt((100 - 0) + 1) + 0;
        System.out.println(randomNum1);
        System.out.println(randomNum2);


        ScrollPane scroll = new ScrollPane();
        scroll.setPrefSize(500, 300);
        Scene scene = new Scene(scroll);

        primaryStage.setScene(scene);


        Group root = new Group();

        HBox hbox = new HBox();

        hbox.setPadding(new Insets(randomNum1));

        VBox vbox = new VBox();
        hbox.getChildren().add(new VBox());

        vbox.setPadding(new Insets(randomNum2));
        hbox.getChildren().add(vbox);
        hbox.getChildren().add(new VBox());

        Circle circle = new Circle();
        circle.setRadius(10);
        vbox.getChildren().add(circle);


        Group lines = new Group();
        root.getChildren().add(hbox);
        root.getChildren().add(lines);

        root.autosize();


        Line line = new Line();
        line.setStartX(0);
        line.setStartY(0);

        //SOME CODE HERE TO WORK OUT WHERE THE CIRCLE IS
        line.setEndX(123);
        line.setEndY(123);

        lines.getChildren().add(line);


        scroll.setContent(root);

        primaryStage.show();
    }



    public static void main(String[] args) {
        System.out.println("Start JavaFXTestApp");
        launch(args);
        System.out.println("End JavaFXTestApp");
    }   
}

1 个答案:

答案 0 :(得分:1)

最后,我有它的工作。我可以添加一个setOnShown处理程序来调用该行。

所以我发现localToScene和sceneToLocal仅在显示窗口后才能工作

    primaryStage.setOnShown(new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent arg0) {
            Point2D p = circle.localToScene(circle.getCenterX(),circle.getCenterY());
            p = line.sceneToLocal(p);
            line.setEndX(p.getX());
            line.setEndY(p.getY());
        }
    });

所以最终的工作计划是:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class TestAppForCoords extends Application {

    //Scene Graph:
    //ScrollPane - scroll
    // - Group - root
    //   - VBox - vboxEXTRA - with random padding
    //     - HBox - hbox - with random padding
    //       - VBox
    //       - VBox - vbox - with random padding
    //         - Circle - circle
    //       - VBox
    //     - Group - lines
    //       - Line - line

    Line line = new Line();
    Circle circle = new Circle();

    @Override
    public void start(final Stage primaryStage) throws Exception {
        Random rand = new Random();
        int randomNum1 = rand.nextInt((100 - 0) + 1) + 0;
        int randomNum2 = rand.nextInt((100 - 0) + 1) + 0;
        int randomNum3 = rand.nextInt((100 - 0) + 1) + 0;
        System.out.println(randomNum1);
        System.out.println(randomNum2);
        System.out.println(randomNum3);


        ScrollPane scroll = new ScrollPane();
        scroll.setPrefSize(500, 300);
        Scene scene = new Scene(scroll);

        primaryStage.setScene(scene);

        Group root = new Group();

        HBox hbox = new HBox();

        hbox.setPadding(new Insets(randomNum1));

        VBox vbox = new VBox();
        hbox.getChildren().add(new VBox());

        vbox.setPadding(new Insets(randomNum2));
        hbox.getChildren().add(vbox);
        hbox.getChildren().add(new VBox());

        circle.setRadius(10);
        vbox.getChildren().add(circle);

        Group lines = new Group();
        root.getChildren().add(hbox);
        root.getChildren().add(lines);

        root.autosize();
        root.requestLayout();



        lines.getChildren().add(line);


        VBox vboxEXTRA = new VBox();
        vboxEXTRA.setPadding(new Insets(randomNum3));
        vboxEXTRA.getChildren().add(root);


        scroll.setContent(vboxEXTRA);

        line.setStartX(0);
        line.setStartY(0);

        //This dosen't work prob because we aren't drawing yet
        Point2D p = circle.localToScene(circle.getCenterX(),circle.getCenterY());
        p = line.sceneToLocal(p);
        line.setEndX(p.getX());
        line.setEndY(p.getY());


        primaryStage.setOnShown(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent arg0) {
                Point2D p = circle.localToScene(circle.getCenterX(),circle.getCenterY());
                p = line.sceneToLocal(p);
                line.setEndX(p.getX());
                line.setEndY(p.getY());
            }
        });

        primaryStage.show();
    }



    public static void main(String[] args) {
        System.out.println("Start JavaFXTestApp");
        launch(args);
        System.out.println("End JavaFXTestApp");
    }   
}