import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Camera; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.PerspectiveCamera; import javafx.scene.PointLight; import javafx.scene.Scene; import javafx.scene.SubScene; import javafx.scene.control.Button; import javafx.scene.control.ColorPicker; import javafx.scene.control.Label; import javafx.scene.control.ScrollBar; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.paint.PhongMaterial; import javafx.scene.shape.Box; import javafx.scene.shape.Sphere; import javafx.stage.Stage; /* * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. */ /** * * @author Andrew Glushchenko */ public class SubSceneTestApp extends Application { protected static int WIDTH = 600; protected static int HEIGHT = 600; protected static int SS_WIDTH = 300; protected static int SS_HEIGHT = 300; protected static int SCALE = 100; private static int scenesCount = 3; private Scene scene; private GridPane gridRoot; private SubScene[] scenes = new SubScene[scenesCount]; private AnchorPane controlsBox; private Group rootTL; private Group rootTR; private Group rootDL; private Stage stage; @Override public void start(Stage stage) throws Exception { this.stage = stage; reinitScene(); stage.show(); } public void reinitScene(){ initScene(); stage.setScene(scene); } protected SubScene getTopLeftScene() { rootTL = (buildGroup()); SubScene ss = new SubScene(rootTL, SS_WIDTH, SS_HEIGHT, true, true); ss.setCamera(new PerspectiveCamera()); return ss; } protected SubScene getTopRightScene() { rootTR = (buildGroup()); SubScene ss = new SubScene(rootTR, SS_WIDTH, SS_HEIGHT, true, true); ss.setCamera(new PerspectiveCamera()); return ss; } protected SubScene getDownLeftScene() { rootDL = (buildGroup()); SubScene ss = new SubScene(rootDL, SS_WIDTH, SS_HEIGHT, true, true); ss.setCamera(new PerspectiveCamera()); return ss; } private static Group buildGroup() { Group grp = new Group(); Sphere s = new Sphere(); s.setScaleX(SCALE); s.setScaleY(SCALE); s.setScaleZ(SCALE); PhongMaterial material = new PhongMaterial(); material.setDiffuseColor(Color.LIGHTGRAY); material.setSpecularColor(Color.rgb(30, 30, 30)); s.setMaterial(material); PointLight pl = new PointLight(Color.AQUA); pl.setTranslateZ(-1000); grp.getChildren().addAll(s, pl); grp.translateXProperty().set(SS_WIDTH / 2); grp.translateYProperty().set(SS_HEIGHT / 2); return grp; } protected void initScene() { gridRoot = new GridPane(); scenes[0] = getTopLeftScene(); scenes[1] = getTopRightScene(); scenes[2] = getDownLeftScene(); gridRoot.add(scenes[0], 0, 0); gridRoot.add(scenes[1], 0, 1); gridRoot.add(scenes[2], 1, 0); gridRoot.add(buildControlsBox(), 1, 1); scene = new Scene(gridRoot, WIDTH, HEIGHT, true); } private Node buildControlsBox() { controlsBox = new AnchorPane(); TabPane tp = new TabPane(); AnchorPane.setTopAnchor(tp, 0D); AnchorPane.setRightAnchor(tp, 0D); AnchorPane.setLeftAnchor(tp, 0D); AnchorPane.setBottomAnchor(tp, 0D); controlsBox.getChildren().add(tp); for (int i = 0; i < 3; i++) { tp.getTabs().add(buildTab(i)); } return controlsBox; } private Tab buildTab(final int i) { Tab tab = new Tab("SubScene" + i); VBox content = getControlsForSubScene(scenes[i]); tab.setContent(content); return tab; } protected VBox getControlsForSubScene(final SubScene ss) { Button reinitRoot = new Button("Reinit Root"); Button reinitCamera = new Button("Reinit Camera"); ColorPicker fillPicker = new ColorPicker((Color) ss.getFill()); ScrollBar sbWidth = new ScrollBar(); ScrollBar sbHeight = new ScrollBar(); VBox controls = new VBox(); controls.setSpacing(5); controls.getChildren().addAll(new HBox(new Label("ROOT"), reinitRoot), new HBox(new Label("CAMERA"), reinitCamera), new HBox(new Label("FILL"), fillPicker), new HBox(new Label("WIDTH"), sbWidth), new HBox(new Label("HEIGHT"), sbHeight)); reinitRoot.setOnAction(new EventHandler() { @Override public void handle(ActionEvent t) { if (reinitRoot(ss)) { System.out.println("Pass"); } else { System.out.println("Fail"); } } }); reinitCamera.setOnAction(new EventHandler() { @Override public void handle(ActionEvent t) { if (reinitCamera(ss)) { System.out.println("Pass"); } else { System.out.println("Fail"); } } }); fillPicker.valueProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue ov, Color t, Color t1) { if (setFill(ss, t1)) { System.out.println("Pass"); } else { System.out.println("Fail"); } } }); sbWidth.setMin(1); sbWidth.setMax(SS_WIDTH); sbWidth.valueProperty().set(ss.getWidth()); sbWidth.valueProperty().bindBidirectional(ss.widthProperty()); sbHeight.setMin(1); sbHeight.setMax(SS_HEIGHT); sbHeight.valueProperty().set(ss.getHeight()); sbHeight.valueProperty().bindBidirectional(ss.heightProperty()); return controls; } private boolean reinitCamera(SubScene ss) { Camera cam = ss.getCamera(); ss.setCamera(new PerspectiveCamera()); return cam != ss.getCamera(); } private boolean reinitRoot(SubScene ss) { Parent p = ss.getRoot(); ss.setRoot(buildGroup()); return p != ss.getParent(); } private boolean setFill(SubScene ss, Color color) { Paint fill = ss.getFill(); if (fill == color) { return true; } ss.setFill(color); return color != fill; } public static void main(String[] args) { launch(args); } }