第二篇 使用JavaFX图形 | JavaFX中文资料
package msaa;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.ConditionalFeature;
import javafx.application.Platform;
import javafx.geometry.Point3D;
import javafx.scene.AmbientLight;
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.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.control.Slider;
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.Cylinder;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class MSAAApp extends Application {

    @Override
    public void start(Stage stage) {//启动舞台
        if (!Platform.isSupported(ConditionalFeature.SCENE3D)) {//判断操作系统是否支持3d场景
            throw new RuntimeException("*** ERROR: common conditional SCENE3D is not supported");
        }

        stage.setTitle("JavaFX 3d圆柱体 demo");

        Group root = new Group();//创建一个节点分组
        Scene scene = new Scene(root, 1000, 800);
        scene.setFill(Color.color(0.2, 0.2, 0.2, 1.0));

        HBox hbox = new HBox();//创建一个水平盒子布局器对象
        hbox.setLayoutX(75);//设置布局器的x轴坐标
        hbox.setLayoutY(200);//设置布局器的y轴坐标

        PhongMaterial phongMaterial = new PhongMaterial(Color.color(1.0, 0.7, 0.8));//创建一个表面材料对象
        Cylinder cylinder1 = new Cylinder(100, 200);//创建个圆柱体对象
        cylinder1.setMaterial(phongMaterial);//给圆柱体包个皮儿
        SubScene noMsaa = createSubScene("MSAA = false", cylinder1,
                Color.TRANSPARENT,
                new PerspectiveCamera(), false);//创建一个子场景
        hbox.getChildren().add(noMsaa);//将盒子布局器上添加一个子场景对象(本例中为无Msaa锯齿状显示效果的子3d场景)

        Cylinder cylinder2 = new Cylinder(100, 200);//创建个圆柱体2
        cylinder2.setMaterial(phongMaterial);//将圆柱体2包个外皮儿
        SubScene msaa = createSubScene("MSAA = true", cylinder2,
                Color.TRANSPARENT,
                new PerspectiveCamera(), true);//创建一个带有锯齿状显示特效的3d子场景,并将刚才建立好的cylider2圆柱体对象加入该子场景中
        hbox.getChildren().add(msaa);//在盒子布局器上再加入一个3d自场景对象msaa

        Slider slider = new Slider(0, 360, 0);//创建一个滑块组件对象
        slider.setBlockIncrement(1);//设置滑块组件的滑动增量参数
        slider.setTranslateX(425);//设置滑块组件的转移x轴坐标值
        slider.setTranslateY(625);//设置滑块组件的转移y轴坐标值
        cylinder1.rotateProperty().bind(slider.valueProperty());//将圆柱体1的旋转特效属性绑定到slider滑块组件对应的滑动交互取值,并设置圆柱体的旋转特效
        cylinder2.rotateProperty().bind(slider.valueProperty());//将圆柱体2的旋转特效属性绑定到slider滑块组件对应的滑动交互取值,并设置圆柱体的旋转特效
        root.getChildren().addAll(hbox, slider);//将初始化根节点分组对象上添加水平盒子布局器对hbox和slider滑块组件对象

        stage.setScene(scene);//舞台上装载整体场景对象scene
        stage.show();//展现舞台效果
    }

    private static Parent setTitle(String str) {
        final VBox vbox = new VBox();//创建一个垂直盒子布局器
        final Text text = new Text(str);//创建一个文本组件
        text.setFont(Font.font("Times New Roman", 24));//设置组件字体
        text.setFill(Color.WHEAT);//设置字的颜色
        vbox.getChildren().add(text);//将文本控件添加到垂直布局器组件中
        return vbox;
    }

    private static SubScene createSubScene(String title, Node node,
                                           Paint fillPaint, Camera camera, boolean msaa) {
        Group root = new Group();//创建一个节点分组

        PointLight light = new PointLight(Color.WHITE);//创建一个灯光特效
        light.setTranslateX(50);
        light.setTranslateY(-300);
        light.setTranslateZ(-400);
        PointLight light2 = new PointLight(Color.color(0.6, 0.3, 0.4));//再创建也给灯光特效
        light2.setTranslateX(400);
        light2.setTranslateY(0);
        light2.setTranslateZ(-400);

        AmbientLight ambientLight = new AmbientLight(Color.color(0.2, 0.2, 0.2));//创建一个曝光特效
        node.setRotationAxis(new Point3D(2, 1, 0).normalize());//将传进来的节点对象的旋转轴设置为一个点
        node.setTranslateX(180);
        node.setTranslateY(180);
        root.getChildren().addAll(setTitle(title), ambientLight,
                light, light2, node);

        SubScene subScene = new SubScene(root, 500, 400, true,
                msaa ? SceneAntialiasing.BALANCED : SceneAntialiasing.DISABLED);//再创建一个子场景并根据设置参数设置3d效果锯齿状显示效果
        subScene.setFill(fillPaint);//将子场景场景上添置绘图内容
        subScene.setCamera(camera);//子场景上挂载镜头对象

        return subScene;//返回所创建的子场景对象
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}