JavaFX官方教程(十五)之A Xylophone.java

翻译自  Xylophone.java

一个 Xylophone.java

有关说明,请参阅转换类型和示例。

法律条款和版权声明

/ **版权所有(c)2010,2014,Oracle和/或其附属公司。* 版权所有。使用须遵守许可条款。**此文件可通过以下许可证获得并获得许可:**重新分发和使用源和二进制形式,有或没有*修改,如果满足以下条件,则允许*符合:**  - 源代码的重新分发必须保留上述版权*通知,此条件清单和以下免责声明。*  - 二进制形式的再分发必须复制上述版权*通知,此条件清单和以下免责声明*随分发提供的文件和/或其他材料。*  -  Oracle的名称和其名称*贡献者可用于支持或推广衍生产品*未经事先书面许可,不得使用本软件。**本软件由版权所有者和贡献者提供*“按原样”以及任何明示或暗示的保证,包括但不包括*限于对适销性和适用性的暗示保证*不承认任何特定目的。在任何情况下都不应该是版权*所有者或贡献者对任何直接,间接,偶然的,*特殊,惩戒或间接损害(包括但不包括)*限于,购买替代商品或服务; 失去使用,*数据或利润; 或商业中断)但不论是什么原因造成的*责任理论,无论是合同,严格责任还是侵权*(包括疏忽或以其他方式)以任何方式使用*本软件,即使被告知此类损害的可能性。* /

源码

package xylophone;import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.DepthTest;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.media.AudioClip;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Shear;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;public class Xylophone extends Application {double mousePosX;double mousePosY;double mouseOldX;double mouseOldY;double mouseDeltaX;double mouseDeltaY;final Cam camOffset = new Cam();final Cam cam = new Cam();final Shear shear = new Shear();class Cam extends Group {Translate t  = new Translate();Translate p  = new Translate();Translate ip = new Translate();Rotate rx = new Rotate();{ rx.setAxis(Rotate.X_AXIS); }Rotate ry = new Rotate();{ ry.setAxis(Rotate.Y_AXIS); }Rotate rz = new Rotate();{ rz.setAxis(Rotate.Z_AXIS); }Scale s = new Scale();public Cam() { super(); getTransforms().addAll(t, p, rx, rz, ry, s, ip); }}@Override public void start(final Stage stage) {stage.setTitle("Xylophone");camOffset.getChildren().add(cam);resetCam();final Scene scene = new Scene(camOffset, 800, 600, true);scene.setFill(new RadialGradient(225, 0.85, 300, 300, 500, false,CycleMethod.NO_CYCLE, new Stop[]{ new Stop(0f, Color.BLUE),new Stop(1f, Color.LIGHTBLUE) }));scene.setCamera(new PerspectiveCamera());final AudioClip bar1Note =new AudioClip(Xylophone.class.getResource("audio/Note1.wav").toString());final AudioClip bar2Note =new AudioClip(Xylophone.class.getResource("audio/Note2.wav").toString());final AudioClip bar3Note =new AudioClip(Xylophone.class.getResource("audio/Note3.wav").toString());final AudioClip bar4Note =new AudioClip(Xylophone.class.getResource("audio/Note4.wav").toString());final AudioClip bar5Note =new AudioClip(Xylophone.class.getResource("audio/Note5.wav").toString());final AudioClip bar6Note =new AudioClip(Xylophone.class.getResource("audio/Note6.wav").toString());final AudioClip bar7Note =new AudioClip(Xylophone.class.getResource("audio/Note7.wav").toString());final AudioClip bar8Note =new AudioClip(Xylophone.class.getResource("audio/Note8.wav").toString());Group rectangleGroup = new Group();rectangleGroup.getTransforms().add(shear);rectangleGroup.setDepthTest(DepthTest.ENABLE);double xStart = 260.0;double xOffset = 30.0;double yPos = 300.0;double zPos = 0.0;double barWidth = 22.0;double barDepth = 7.0;// Base1Cube base1Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0);base1Cube.setTranslateX(xStart + 135);base1Cube.setTranslateZ(yPos+20.0);base1Cube.setTranslateY(11.0);base1Cube.setScaleX(barWidth*11.5);base1Cube.setScaleZ(10.0);base1Cube.setScaleY(barDepth*2.0);// Base2Cube base2Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0);base2Cube.setTranslateX(xStart + 135);base2Cube.setTranslateZ(yPos-20.0);base2Cube.setTranslateY(11.0);base2Cube.setScaleX(barWidth*11.5);base2Cube.setScaleZ(10.0);base2Cube.setScaleY(barDepth*2.0);// Bar1Cube bar1Cube = new Cube(1.0, Color.PURPLE, 1.0);bar1Cube.setTranslateX(xStart + 1*xOffset);bar1Cube.setTranslateZ(yPos);bar1Cube.setScaleX(barWidth);bar1Cube.setScaleZ(100.0);bar1Cube.setScaleY(barDepth);// Bar2Cube bar2Cube = new Cube(1.0, Color.BLUEVIOLET, 1.0);bar2Cube.setTranslateX(xStart + 2*xOffset);bar2Cube.setTranslateZ(yPos);bar2Cube.setScaleX(barWidth);bar2Cube.setScaleZ(95.0);bar2Cube.setScaleY(barDepth);// Bar3Cube bar3Cube = new Cube(1.0, Color.BLUE, 1.0);bar3Cube.setTranslateX(xStart + 3*xOffset);bar3Cube.setTranslateZ(yPos);bar3Cube.setScaleX(barWidth);bar3Cube.setScaleZ(90.0);bar3Cube.setScaleY(barDepth);// Bar4Cube bar4Cube = new Cube(1.0, Color.GREEN, 1.0);bar4Cube.setTranslateX(xStart + 4*xOffset);bar4Cube.setTranslateZ(yPos);bar4Cube.setScaleX(barWidth);bar4Cube.setScaleZ(85.0);bar4Cube.setScaleY(barDepth);// Bar5Cube bar5Cube = new Cube(1.0, Color.GREENYELLOW, 1.0);bar5Cube.setTranslateX(xStart + 5*xOffset);bar5Cube.setTranslateZ(yPos);bar5Cube.setScaleX(barWidth);bar5Cube.setScaleZ(80.0);bar5Cube.setScaleY(barDepth);// Bar6Cube bar6Cube = new Cube(1.0, Color.YELLOW, 1.0);bar6Cube.setTranslateX(xStart + 6*xOffset);bar6Cube.setTranslateZ(yPos);bar6Cube.setScaleX(barWidth);bar6Cube.setScaleZ(75.0);bar6Cube.setScaleY(barDepth);// Bar7Cube bar7Cube = new Cube(1.0, Color.ORANGE, 1.0);bar7Cube.setTranslateX(xStart + 7*xOffset);bar7Cube.setTranslateZ(yPos);bar7Cube.setScaleX(barWidth);bar7Cube.setScaleZ(70.0);bar7Cube.setScaleY(barDepth);// Bar8Cube bar8Cube = new Cube(1.0, Color.RED, 1.0);bar8Cube.setTranslateX(xStart + 8*xOffset);bar8Cube.setTranslateZ(yPos);bar8Cube.setScaleX(barWidth);bar8Cube.setScaleZ(65.0);bar8Cube.setScaleY(barDepth);bar1Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar1Note.play(); }});bar2Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar2Note.play(); }});bar3Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar3Note.play(); }});bar4Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar4Note.play(); }});bar5Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar5Note.play(); }});bar6Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar6Note.play(); }});bar7Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar7Note.play(); }});bar8Cube.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) { bar8Note.play(); }});rectangleGroup.getChildren().addAll(base1Cube, base2Cube,bar1Cube, bar2Cube, bar3Cube,bar4Cube, bar5Cube, bar6Cube,bar7Cube, bar8Cube);rectangleGroup.setScaleX(2.5);rectangleGroup.setScaleY(2.5);rectangleGroup.setScaleZ(2.5);cam.getChildren().add(rectangleGroup);frameCam(stage, scene);scene.setOnMousePressed(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) {mousePosX = me.getX();mousePosY = me.getY();mouseOldX = me.getX();mouseOldY = me.getY();//System.out.println("scene.setOnMousePressed " + me);}});scene.setOnMouseDragged(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent me) {mouseOldX = mousePosX;mouseOldY = mousePosY;mousePosX = me.getX();mousePosY = me.getY();mouseDeltaX = mousePosX - mouseOldX;mouseDeltaY = mousePosY - mouseOldY;if (me.isAltDown() && me.isShiftDown() && me.isPrimaryButtonDown()) {double rzAngle = cam.rz.getAngle();cam.rz.setAngle(rzAngle - mouseDeltaX);}else if (me.isAltDown() && me.isPrimaryButtonDown()) {double ryAngle = cam.ry.getAngle();cam.ry.setAngle(ryAngle - mouseDeltaX);double rxAngle = cam.rx.getAngle();cam.rx.setAngle(rxAngle + mouseDeltaY);}else if (me.isShiftDown() && me.isPrimaryButtonDown()) {double yShear = shear.getY();shear.setY(yShear + mouseDeltaY/1000.0);double xShear = shear.getX();shear.setX(xShear + mouseDeltaX/1000.0);}else if (me.isAltDown() && me.isSecondaryButtonDown()) {double scale = cam.s.getX();double newScale = scale + mouseDeltaX*0.01;cam.s.setX(newScale);cam.s.setY(newScale);cam.s.setZ(newScale);}else if (me.isAltDown() && me.isMiddleButtonDown()) {double tx = cam.t.getX();double ty = cam.t.getY();cam.t.setX(tx + mouseDeltaX);cam.t.setY(ty + mouseDeltaY);}                }});scene.setOnKeyPressed(new EventHandler<KeyEvent>() {@Overridepublic void handle(KeyEvent ke) {if (KeyCode.A.equals(ke.getCode())) {resetCam();shear.setX(0.0);shear.setY(0.0);}if (KeyCode.F.equals(ke.getCode())) {frameCam(stage, scene);shear.setX(0.0);shear.setY(0.0);}if (KeyCode.SPACE.equals(ke.getCode())) {if (stage.isFullScreen()) {stage.setFullScreen(false);frameCam(stage, scene);} else {stage.setFullScreen(true);frameCam(stage, scene);}}}});stage.setScene(scene);stage.show();}//=========================================================================// CubeSystem.frameCam//=========================================================================public void frameCam(final Stage stage, final Scene scene) {setCamOffset(camOffset, scene);// cam.resetTSP();setCamPivot(cam);setCamTranslate(cam);setCamScale(cam, scene);}//=========================================================================// CubeSystem.setCamOffset//=========================================================================public void setCamOffset(final Cam camOffset, final Scene scene) {double width = scene.getWidth();double height = scene.getHeight();camOffset.t.setX(width/2.0);camOffset.t.setY(height/2.0);}//=========================================================================// setCamScale//=========================================================================public void setCamScale(final Cam cam, final Scene scene) {final Bounds bounds = cam.getBoundsInLocal();final double pivotX = bounds.getMinX() + bounds.getWidth()/2;final double pivotY = bounds.getMinY() + bounds.getHeight()/2;final double pivotZ = bounds.getMinZ() + bounds.getDepth()/2;double width = scene.getWidth();double height = scene.getHeight();double scaleFactor = 1.0;double scaleFactorY = 1.0;double scaleFactorX = 1.0;if (bounds.getWidth() > 0.0001) {scaleFactorX = width / bounds.getWidth(); // / 2.0;}if (bounds.getHeight() > 0.0001) {scaleFactorY = height / bounds.getHeight(); //  / 1.5;}if (scaleFactorX > scaleFactorY) {scaleFactor = scaleFactorY;} else {scaleFactor = scaleFactorX;}cam.s.setX(scaleFactor);cam.s.setY(scaleFactor);cam.s.setZ(scaleFactor);}//=========================================================================// setCamPivot//=========================================================================public void setCamPivot(final Cam cam) {final Bounds bounds = cam.getBoundsInLocal();final double pivotX = bounds.getMinX() + bounds.getWidth()/2;final double pivotY = bounds.getMinY() + bounds.getHeight()/2;final double pivotZ = bounds.getMinZ() + bounds.getDepth()/2;cam.p.setX(pivotX);cam.p.setY(pivotY);cam.p.setZ(pivotZ);cam.ip.setX(-pivotX);cam.ip.setY(-pivotY);cam.ip.setZ(-pivotZ);}//=========================================================================// setCamTranslate//=========================================================================public void setCamTranslate(final Cam cam) {final Bounds bounds = cam.getBoundsInLocal();final double pivotX = bounds.getMinX() + bounds.getWidth()/2;final double pivotY = bounds.getMinY() + bounds.getHeight()/2;cam.t.setX(-pivotX);cam.t.setY(-pivotY);}public void resetCam() {cam.t.setX(0.0);cam.t.setY(0.0);cam.t.setZ(0.0);cam.rx.setAngle(45.0);cam.ry.setAngle(-7.0);cam.rz.setAngle(0.0);cam.s.setX(1.25);cam.s.setY(1.25);cam.s.setZ(1.25);cam.p.setX(0.0);cam.p.setY(0.0);cam.p.setZ(0.0);cam.ip.setX(0.0);cam.ip.setY(0.0);cam.ip.setZ(0.0);final Bounds bounds = cam.getBoundsInLocal();final double pivotX = bounds.getMinX() + bounds.getWidth() / 2;final double pivotY = bounds.getMinY() + bounds.getHeight() / 2;final double pivotZ = bounds.getMinZ() + bounds.getDepth() / 2;cam.p.setX(pivotX);cam.p.setY(pivotY);cam.p.setZ(pivotZ);cam.ip.setX(-pivotX);cam.ip.setY(-pivotY);cam.ip.setZ(-pivotZ);}public class Cube extends Group {final Rotate rx = new Rotate(0, Rotate.X_AXIS);final Rotate ry = new Rotate(0, Rotate.Y_AXIS);final Rotate rz = new Rotate(0, Rotate.Z_AXIS);public Cube(double size, Color color, double shade) {getTransforms().addAll(rz, ry, rx);//          back faceRectangle backFace = new Rectangle(size,size);backFace.setFill(color.deriveColor(0.0, 1.0, (1 - 0.5*shade), 1.0));backFace.setTranslateX(-0.5*size);backFace.setTranslateY(-0.5*size);backFace.setTranslateZ(-0.5*size);// bottom faceRectangle bottomFace = new Rectangle(size,size);bottomFace.setFill(color.deriveColor(0.0, 1.0, (1 - 0.4*shade), 1.0));bottomFace.setTranslateX(-0.5*size);bottomFace.setTranslateY(0);bottomFace.setRotationAxis(Rotate.X_AXIS);bottomFace.setRotate(90);//          right faceRectangle rightFace = new Rectangle(size,size);rightFace.setFill(color.deriveColor(0.0, 1.0, (1 - 0.3*shade), 1.0));rightFace.setTranslateX(-1*size);rightFace.setTranslateY(-0.5*size);rightFace.setRotationAxis(Rotate.Y_AXIS);rightFace.setRotate(90);//            leftFaceRectangle leftFace = new Rectangle(size,size);leftFace.setFill(color.deriveColor(0.0, 1.0, (1 - 0.2*shade), 1.0));leftFace.setTranslateX(0);leftFace.setTranslateY(-0.5*size);leftFace.setRotationAxis(Rotate.Y_AXIS);leftFace.setRotate(90);//            topFaceRectangle topFace = new Rectangle(size,size);topFace.setFill(color.deriveColor(0.0, 1.0, (1 - 0.1*shade), 1.0));topFace.setTranslateX(-0.5*size);topFace.setTranslateY(-1*size);topFace.setRotationAxis(Rotate.X_AXIS);topFace.setRotate(90);//          frontFaceRectangle frontFace = new Rectangle(size,size);frontFace.setFill(color);frontFace.setTranslateX(-0.5*size);frontFace.setTranslateY(-0.5*size);frontFace.setTranslateZ(-0.5*size);getChildren().addAll(backFace, bottomFace, rightFace, leftFace, topFace,frontFace);}}public static void main(String[] args) {Application.launch(args);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

索引,事务,视图

索引 此时是要获取所有的数据&#xff0c;是否有索引作用不大 select * from emp – 因为数据库以及自动的给主键列empno创建了索引&#xff0c;查询条件中出现empno&#xff0c;自动使用索引进行查询 – 是否使用索引&#xff0c;语句没有区别 select * from emp where empno…

配置环境变量 path

原理 根据windows系统在查找可执行程序的原理&#xff0c;可以将java工具所在路径定义到path 环境变量中&#xff0c;让系统帮我们去找运行执行的程序。 配置方法 我的电脑–属性–高级系统设置–环境变量 编辑 path 环境变量&#xff0c;在变量值开始处加上java工具所在目录…

ssl2863-石子合并【dp练习】

Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。 Input 每组数据第1行为一个…

《走遍中国》珍藏版(四)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");游走其中&a…

前端框架选型

前面的话 有一个流传较广的笑话&#xff0c;一个人在stackoverflow中提了一个问题&#xff0c;如何使用javascript实现一个数字与另外一个数字相加。最高票回答是你应该使用jQuery插件&#xff0c;jQuery插件可以做任何事情。 历史总是在重演&#xff0c;以前是jQuery&#xff…

JavaFX UI控件教程(一)之简述

翻译自 JavaFX UI控件概述 关于本教程 本教程介绍JavaFX API中提供的内置JavaFX UI控件。 该文件包含以下章节&#xff1a; JavaFX UI控件 标签 按钮 单选按钮 切换按钮 复选框 选择框 文本域 密码框 滚动条 滚动面板 列表视图 表视图 树视图 组合框 分隔器…

断言、触发器、存储过程

断言 assertion 设置每一门课程最多有60人选修 create assertion a check (60 > all ( select count(*) from sc group by cno) ); drop assertion a; 触发器 trigger 删除触发器 drop tigger a on student 存储过程 定义一个没有返回值的存储过程 create procedure my…

《走遍中国》珍藏版(五)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");陕西&#…

ssl1007 and ssl -最大乘积 and 加法最大【区间dp练习】

Description   今年是国际数学联盟确定的“2000——世界数学年”&#xff0c;又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛&#xff0c;组织了一场别开生面的数学智力竞赛的活动&#xff0c;你的一个好朋友XZ也有幸得以参加。活动中&#xff0c;主…

一个java源文件中可以声明多少个class与编译后会生成多少个字节码文件

在一个java源文件中可以声明多个class。 但是&#xff0c;只能最多有一个类声明为public的。 而且要求声明为public的类的类名必须与源文件名相同。 编译的过程 编译以后&#xff0c;会生成一个或多个字节码文件。字节码文件的文件名与java源文件中的类名相同。 运行 只能运…

用户管理

用户管理 查询用户 use mysql select * from user use mydb select * from mysql.user – 创建用户 create user ‘zhangsan’ identified by ‘zhangsan’ – create user ‘用户名’‘主机名’ identified by ‘密码’ create user ‘lisi’‘localhost’ identified by ‘…

JavaFX UI控件教程(二)之JavaFX UI控件

翻译自 JavaFX UI控件 本章概述了通过API提供的JavaFX UI控件。 JavaFX UI控件是使用场景图中的节点构建的。因此&#xff0c;控件可以使用JavaFX平台的视觉丰富功能。由于JavaFX API完全用Java实现&#xff0c;因此您可以轻松地将JavaFX UI控件集成到现有的Java应用程序中…

《走遍中国》珍藏版(六)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");草长莺飞&a…

JDK,JRE,JVM三者的关系

JDKJREJava的开发工具(javac.exe,java.exe,javadoc.exe) JREJVMJava核心类库

ssl1597-石子合并问题【区间dp练习】

Description   在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。试设计一个算法&#xff0c;计算出将n堆石子合并成一堆的最小得分和最大得分。 编程任务…

JavaFX UI控件教程(三)之Label

翻译自 Label 本章介绍如何使用Label驻留在javafx.scene.controlJavaFX API包中的类来显示文本元素。了解如何包装文本元素以适合特定空间&#xff0c;添加图形图像或应用视觉效果。 图2-1显示了三种常见的标签用法。左侧的标签是带有图像的文本元素&#xff0c;中间的标签表…

asp.net core中负载均衡场景下http重定向https的问题

上周欣喜地发现&#xff0c;微软官方终于针对 asp.net core 在使用负载均衡的情况下从 http 强制重定向至 https 的问题提供了解决方法。 app.UseForwardedHeaders(new ForwardedHeadersOptions {ForwardedHeaders ForwardedHeaders.XForwardedProto });var options new Rew…

《走遍中国》珍藏版(七)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");鸣沙山群峰…

JavaFX UI控件教程(四)之Button

翻译自 Button Button通过JavaFX API提供的类使开发人员能够在用户单击按钮时处理操作。该Button班是的扩展Labeled类。它可以显示文本&#xff0c;图像或两者。图3-1显示了具有各种效果的按钮。在本章中&#xff0c;您将学习如何创建这些按钮类型。 图3-1按钮类型 创建一个按…