用JAVAFX做一个简单的桌面宠物(一)
一、写在前面
这学期才学的java,课设不会写游戏,只好做一个桌面宠物了。JavaFX更是第一次用,边学边做的,所以有不足的地方还请提出,感激不尽。环境:jdk1.8.0_241, eclipse。用javafx是因为它gif的显示效果很好,不会像swing那样闪烁或循环过快,用来做桌面宠物正合适。宠物用的是罗小黑和比丢(墙裂推荐,超好看的国漫),lxh和biu分别是它们对应的图片文件夹,。有四个类,包括Main(设置窗体),EventListener(处理点击事件和加载图片),UI(设置系统托盘、弹出菜单、聊天气泡和实现自定义功能),Move(实现自动行走)。源代码:https://gitee.com/june_day/javafx_desktop_pet二、窗体设置(Main类)
(一)类成员
private static ImageView imageView;EventListener listen;VBox messageBox;//聊天气泡int petID = 1;//宠物ID。罗小黑=0,比丢=1double xOffset = 0;double yOffset = 0; 123456
(二)图片容器
Image image = new Image(this.getClass().getResourceAsStream("/biu/biu0.gif"));//biu即比丢ImageView imageView = new ImageView(image);//设置容器的位置imageView.setX(0);imageView.setY(0);imageView.setLayoutX(0);imageView.setLayoutY(50);//设置图片显示的大小imageView.setFitHeight(150);imageView.setFitWidth(150);imageView.setPreserveRatio(true); //保留 width:height的比例 1234567891011
特别说明:加载相对路径的图片要用class.getResourceAsStream,不然打包成jar包运行时会报错:找不到文件路径!路径中第一个“/”是必需的,它表示类的根目录,类文件夹在此项目中与lxh文件夹和biu文件夹在同一级。
(三)创建UI类
UI ui = new UI(imageView, petID, listen,primaryStage);ui.addMessageBox("你好吖~"); 12
(四)创建pane, scene, stage
AnchorPane pane = new AnchorPane(ui.getMessageBox(),ui.getImageView());Scene scene = new Scene(pane,400,400);scene.setFill(null);primaryStage.setScene(scene);//设置窗体的初始位置primaryStage.setX(850);primaryStage.setY(400);primaryStage.setAlwaysOnTop(true);//窗口总显示在最前//因为最后要播放告别动画,所以要延缓关闭primaryStage.setOnCloseRequest( event ->{event.consume(); ui.end();});primaryStage.show(); 1234567891011
对primaryStage.setOnCloseRequest( event ->{event.consume(); ui.end();});的说明:
点击任务栏的“关闭窗口”时,播放告别动画,同时使托盘的图标也关闭。event.consume()是必需的,这样才能真正阻止Window Close事件的默认处理。如果不设置告别动画,可以仅仅使用System.exit(0);来直接退出,不需要event.consume();(五)设置窗体背景透明
imageView.setStyle("-fx-background:transparent;"); pane.setStyle("-fx-background:transparent;"); primaryStage.initStyle(StageStyle.TRANSPARENT); 123
这样做之后标题栏、边框、右上角的关闭等按钮也都没有了。
(六)让宠物可拖动
//先获取按下鼠标时的坐标p1,再将窗体坐标设为p1加拖动的位移量pane.setOnMousePressed(event -> { xOffset = event.getSceneX(); yOffset = event.getSceneY();});pane.setOnMouseDragged(event -> {primaryStage.setX(event.getScreenX() - xOffset);primaryStage.setY(event.getScreenY() - yOffset);}); 123456789
三、Main类完整代码
public class Main extends Application {private static ImageView imageView;EventListener listen;VBox messageBox;//聊天气泡int petID = 1;//宠物ID。罗小黑=0,比丢=1double xOffset = 0;double yOffset = 0;public void start(Stage primaryStage) {try {/* * 创建初始的图 * 加载相对路径的图片要用class.getResource,不然运行jar包时会报错:找不到文件路径! * 路径中第一个“/”是必需的,它表示类的根目录,类文件夹在此项目中与lxh和biu在同一级 */Image image = new Image(this.getClass().getResourceAsStream("/biu/biu0.gif"));imageView = new ImageView(image);imageView.setX(0);imageView.setY(0);imageView.setLayoutX(0);imageView.setLayoutY(50);//设置图片显示的大小imageView.setFitHeight(150);imageView.setFitWidth(150);//添加图片的点击事件listen = new EventListener(imageView , petID);imageView.addEventHandler(MouseEvent.MOUSE_CLICKED, listen);imageView.setPreserveRatio(true); //保留 width:height的比例imageView.setStyle("-fx-background:transparent;");//容器背景设为透明UI ui = new UI(imageView, petID, listen,primaryStage);ui.addMessageBox("你好吖~");AnchorPane pane = new AnchorPane(ui.getMessageBox(),ui.getImageView());pane.setStyle("-fx-background:transparent;");//使窗体能拖动。先获取按下鼠标时的坐标p1,再将窗体坐标设为p1加拖动的位移量pane.setOnMousePressed(event -> { xOffset = event.getSceneX(); yOffset = event.getSceneY();});pane.setOnMouseDragged(event -> {primaryStage.setX(event.getScreenX() - xOffset);primaryStage.setY(event.getScreenY() - yOffset);});Scene scene = new Scene(pane,400,400);scene.setFill(null);scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());primaryStage.setScene(scene);//设置窗体的初始位置primaryStage.setX(850);primaryStage.setY(400);primaryStage.setAlwaysOnTop(true);//窗口总显示在最前//修改任务栏图标primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("icon.png")));//下句隐藏任务栏图标,但javafx的stage.initStyle(Style)只能有一个起效,只好作罢 //stage.initStyle(StageStyle.UTILITY);primaryStage.initStyle(StageStyle.TRANSPARENT);//背景透明/* * 点击任务栏的“关闭窗口”时,播放告别动画,同时使托盘的图标也关闭. * event.consume()是必需的,这样才能真正阻止Window Close事件的默认处理。 * 如果仅仅使用System.exit(0);则不需要event.consume();*/primaryStage.setOnCloseRequest( event ->{event.consume(); ui.end();});primaryStage.show();ui.setTray(primaryStage);//添加系统托盘Thread thread = new Thread(ui);thread.start();} catch(Exception e) {e.printStackTrace();}}public static void main(String[] args) {launch(args);} }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980相关知识
用JAVAFX做一个简单的桌面宠物(三)
java开发桌面宠物
用python做一个宠物系统
用简单食材,给狗狗做一个真正能吃的生日蛋糕吧
用QT实现一个简单的桌面宠物
桌面宠物,3只可爱的小猫
用Python制作桌面宠物
基于WPF的桌面宠物开发(一) :WPF简介+环境搭建+简单界面
用Python写个桌面挂件,手把手带你做只桌面宠物~
Python实现桌面挂件,做一只可爱的桌面宠物~
网址: 用JAVAFX做一个简单的桌面宠物(一) https://www.mcbbbk.com/newsview692255.html
上一篇: 猫咪便利店 |
下一篇: 让宠物狗不再把鞋子叼上床的方法( |
推荐分享

- 1养玉米蛇的危害 28694
- 2狗交配为什么会锁住?从狗狗生 7180
- 3我的狗老公李淑敏33——如何 6236
- 4豆柴犬为什么不建议养?可爱的 4637
- 5南京宠物粮食薄荷饼宠物食品包 4563
- 6中国境内禁养的十大鸟种,你知 4429
- 7湖南隆飞尔动物药业有限公司宠 4259
- 8自制狗狗辅食:棉花面纱犬的美 4257
- 9家养水獭多少钱一只正常 4212
- 10广州哪里卖宠物猫狗的选择性多 4122