关于javafx:jfxcentralcom新版上线啦

作为JavaFX的大本营,新网站提供了库、工具、视频、书籍、教程、博客、人员、团队、案例展现等等,能够说对于JavaFX的所有! 同时该网站自身,也是用JavaFX开发的,开源,能作为桌面程序运行! 看介绍是应用了jpro.one,把JavaFX转为B/S,从而在浏览器拜访。能实现相似成果的还有webfx.dev。 烧哥最关注的每周动向,https://webtechie.be/posts/,也迁徙到https://www.jfx-central.com/links啦! 最新的JavaFX21行将公布,又会更新哪些内容呢?示意期待!

August 28, 2023 · 1 min · jiezi

关于javafx:JavaFX学习笔记三-架构与图形系统

概述 上图是阐明了JavaFX 平台各个各个架构组件,咱们将简要形容每个组件的作用以及各个组件之间的分割。最上层是Java FX 公开API(给开发者应用的)Scene Graph。在Java FX 公开API上面是运行JavaFX 代码的引擎,这个引擎由JavaFX 高性能图形引擎: Prism, 一个玲珑而又高巧的窗口零碎: Glass。一个多媒体引擎,一个Web引擎。只管这些组件对外部不看见,上面这些形容能够让你了解JavaFX利用是如何运行的。 Scene Graph (场景图)The JavaFX scene graph, shown as part of the top layer in Figure 2-1, is the starting point for constructing a JavaFX application. It is a hierarchical tree of nodes that represents all of the visual elements of the application's user interface. It can handle input and can be rendered. JavaFX 场景图是上图的最上层,是构建JavaFX利用的终点,场景图的构造是一颗分层的结点树,所有应用程序用户界面的所有可视元素都在下面。它能够解决输出,并且能够渲染。 A single element in a scene graph is called a node. Each node has an ID, style class, and bounding volume. With the exception of the root node of a scene graph, each node in a scene graph has a single parent and zero or more children. It can also have the following: ...

December 24, 2022 · 12 min · jiezi

关于javafx:JavaFX学习笔记二-关键特性与基本概念

从篇幅上来看前面的控件示例 分成两篇比拟好。前言依照我JavaFX系列的打算应该是: (一) 介绍基本概念(二) 布局与UI控件示例(三) 一个小的桌面零碎(四) JavaFX 打包(四) FXGL(JavaFX的游戏引擎)入门与基本概念(五) 罕用示例(六) 小型游戏零碎的构建以前感觉JavaFX的材料少,然而前面在搜索引擎瞎搜,就搜到了oracle写的用户领导: https://docs.oracle.com/javas... 在这个用户领导外面你能够看到JavaFX的架构、基本概念、示例都有,甚至我还找到了Java 8的官网示例(JavaFX 和 Java8的): https://www.oracle.com/java/t... 认真一看其实官网出的领导还是很清晰的,我大抵对其做了翻译: Getting Started with JavaFX What Is JavaFX 什么是JavaFX? Get Started with JavaFX 开启学习JavaFX之旅 Get Acquainted with JavaFX Architecture 相熟javaFX的架构 Deployment Guide 部署指南 Graphics (图形化) Getting Started with JavaFX 3D Graphics (3D图形化)Use the Image Ops API (图片操作API)Work with Canvas (画布)User Interface Components (UI组件) Work with UI Controls (应用UI组件) 下拉框、输入框、菜单,JavaFX都封装好了。 Create Charts (创立图表) 统计图表 ...

December 24, 2022 · 6 min · jiezi

关于javafx:JavaFx教程一-基本概念

往年打算踏出畛域之外,做一点桌面开发,在几个桌面开发之间抉择了一下,最终还是抉择了JavaFx,起因这个也是用Java做的,不必再学习一门语言。JavaFx还有一个游戏引擎,打算前面写一点游戏玩玩。那么JDK版本的抉择呢,抉择了JDK 11,很大的起因在于JDK 带有 Jlink能够对JDK进行裁剪,让最终生成的平台包尽可能的小。 javaFx 有个非常不错的文档: https://fxdocs.github.io/docs... 本篇教程基本上根据这个文档。浏览本系列教程的前提是有JavaSE的根底,maven熟练掌握。 前言在我迈入大学的时候,我没想到第一门编程语言进去的是一个黑窗口,这让我非常失落,这让我一点能源都没有,甚至让我一度非常失落。前面我买了本C语言游戏开发,感觉蛮有意思的,然而投入精力不多,我过后的次要精力还是用在数学上。前面开了Java课程,我其实也没那么有兴致,翻到教科书前面发现有桌面开发,于是兴奋起来,然而发现Java Swing比拟丑: 于是放弃了学习的想法。然而偶然间发现了Java出了JavaFx,看了看界面发现长的不错,是个“标致的小姑娘”,再加上有个游戏引擎,我打算开发写点游戏玩玩,就打算简略学习一下。 javaFx 是啥?JavaFX 是一个开源的下一代客户端利用平台,实用于基于Java构建的桌面、挪动端和嵌入式零碎。 --- javaFx官网所以JavaFx是一个利用平台,咱们能够借助JavaFx来构建图形化利用。 从Hello World开始JDK 11 的装置这里不再赘述,除此之外还须要一个maven archetype,第一个例子咱们先跟着做。上面是装置JavaFx archetype 的脚本: git clone https://github.com/openjfx/javafx-maven-archetypes.gitcd javafx-maven-archetypesmvn clean install # 坐标如下GroupId = org.openjfxArtifactId = javafx-archetype-simple 略微解释一下,JDK 11 进行了模块化,rt这个包引入不到。 就会呈现一个窗口: 这个maven 模板产生的java Fx 的依赖版本是 13 ,我将其改为了11。上面来解释一下这个代码: public class App extends Application { @Override public void start(Stage stage) { var javaVersion = SystemInfo.javaVersion(); var javafxVersion = SystemInfo.javafxVersion(); var label = new Label("Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + "."); var scene = new Scene(new StackPane(label), 640, 480); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(); }public class SystemInfo { // 获取以后Java的版本 public static String javaVersion() { return System.getProperty("java.version"); } // 获取以后javaFx的版本 public static String javafxVersion() { return System.getProperty("javafx.version"); }}进去的图形的数据结构如下所示: ...

October 1, 2022 · 2 min · jiezi

关于javafx:javafx-常用类库资源

bootstrapfxbootstrap格调的JavaFX独特的CSS样式表,详情点击github查看详情 ControlsFXjavafx UI 控件库,,详情点击github查看详情 FormsFXjavafx 表单控件,详情点击github查看详情 Ikonlijavafx icon 库,详情点击官网查看 相干介绍文章 JavaFX技巧32:须要图标吗? 应用Ikonli!JavaFx之Ikonli图标库大全(十五)TilesFXjavafx 仪表盘图表库,详情点击官网查看 ValidatorFXJavafx 验证库,详情点击github查看详情

April 13, 2022 · 1 min · jiezi

关于javafx:javafx开发exe程序内嵌web项目

目标开发打包一个exe软件,用于展现web我的项目内容。[仅供学习应用]应用 javaFX | BorderPane 布局 1.top局部 自定义窗口头部 ( icon, 题目,返回按钮,清理按钮,放大按钮,放大按钮,敞开按钮) 2.center局部 嵌入chrome内核浏览器(jxbrowser),用于展现我的项目内容 开发环境32位是为了打出32位的程序和安装包,应用32位是为了让32位和64位零碎都可应用。jre1.8是javafx的运行时环境,为了可能让程序在其余没有装置jdk的电脑上装置运行,须要把32位的jre环境打包进程序中.应用jxbrowser不是用自带webview的起因在于 webview卡顿重大且渲染页面会造成款式错乱.jdk1.8exe4j 5.0.1 (32位)inno setup 5.6.1 (32位)jre1.8的运行文件(32位)jxbrowser-6.22.1.jar 和 jxbrowser-win32-6.22.1.jar (须要破解能力应用【仅供学习】, 破解步骤如下) teamdev.licenses (放在打jar包生成的 META-INF 中) Product: JxBrowserVersion: 6.xLicensed to: Kagura.meLicense type: EnterpriseLicense info: JxBrowser LicenseExpiration date: 01-01-9999Support expiration date: NO SUPPORTGeneration date: 01-01-1970Platforms: win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64Company name: TeamDev Ltd.SigB: 1SigA: 1代码中(动态代码块, 必须比其余代码先运行) static { try { Field e = bb.class.getDeclaredField("e"); e.setAccessible(true); Field f = bb.class.getDeclaredField("f"); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); modifersField.setAccessible(true); modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL); modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); e.set(null, new BigInteger("1")); f.set(null, new BigInteger("1")); modifersField.setAccessible(false); } catch (Exception e1) { e1.printStackTrace(); }}开发思路利用javaFX开发内部窗口,而后嵌入chrome浏览器将开发出的程序打成jar包利用exe4j将jar包打成exe启动程序在用inno setup将exe程序封装成一个程序安装包代码如果没有我的项目地址,可用browser.loadHTML("测试页面"), 加载dom节点进行页面渲染;如果有我的项目地址,可用browser.loadURL(testUrl); 间接获取我的项目页面或者可用第三方网站地址 browser.loadURL(“https://www.baidu.com”)获取内容查看 ...

September 18, 2020 · 6 min · jiezi

JavaFX获取屏幕尺寸

1 awtDimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();double width = screenSize.getWidth();double height = screenSize.getHeight();2 javafxRectangle2D screenRectangle = Screen.getPrimary().getBounds();double width = screenRectangle.getWidth();double height = screenRectangle.getHeight();

May 31, 2020 · 1 min · jiezi

浏览器exe桌面应用用javafx-webview-打造自己的浏览器

背景项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术java 1.8开始吧!java环境配置略 hello worldimport javafx.application.Application;import javafx.beans.value.ChangeListener;import javafx.beans.value.ObservableValue;import javafx.concurrent.Worker;import javafx.concurrent.Worker.State;import javafx.scene.Group;import javafx.scene.Scene;import javafx.scene.control.ScrollPane;import javafx.scene.web.WebEngine;import javafx.scene.web.WebView;import javafx.stage.Stage;//www.qingmiaokeji.cnpublic class Main extends Application { @Override public void start(final Stage stage) { stage.setWidth(400); stage.setHeight(500); Scene scene = new Scene(new Group()); final WebView browser = new WebView(); final WebEngine webEngine = browser.getEngine(); ScrollPane scrollPane = new ScrollPane(); scrollPane.setContent(browser); webEngine.getLoadWorker().stateProperty() .addListener(new ChangeListener<State>() { @Override public void changed(ObservableValue ov, State oldState, State newState) { if (newState == Worker.State.SUCCEEDED) { stage.setTitle(webEngine.getLocation()); } } }); webEngine.load("http://www.baidu.com"); scene.setRoot(scrollPane); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); }}效果 ...

June 14, 2019 · 1 min · jiezi

浏览器exe桌面应用用javafx-webview-打造自己的浏览器全屏自适应屏幕

接着上一篇 全屏 Scene scene = new Scene(new Group()); stage.setMaximized(true);自适应屏幕 ScrollPane scrollPane = new ScrollPane(); scrollPane.setFitToHeight(true); scrollPane.setFitToWidth(true); scrollPane.setContent(browser);

June 14, 2019 · 1 min · jiezi

JavaFx中Controller获取Stage并自定义窗口移动与缩放逻辑

JavaFx中Controller获取Stage并自定义窗口移动与缩放逻辑由于去掉了平台自带了标题栏,窗口就无法移动和缩放了,需要我们自己来实现。去除窗口标题栏public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource(“main.fxml”)); primaryStage.setTitle(“main”); // 主要是这一句 primaryStage.initStyle(StageStyle.TRANSPARENT); primaryStage.setScene(new Scene(root)); primaryStage.show(); } public static void main(String[] args) { launch(args); }}在Controller中获取Stage首先确定在Controller中获取到你的跟布局对象,如下:public class Controller implements Initializable { public BorderPane root; private Stage stage;}<BorderPane fx:id=“root” maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight=“400.0” prefWidth=“600.0” stylesheets="@../css/main.css" xmlns=“http://javafx.com/javafx/8.0.172-ea" xmlns:fx=“http://javafx.com/fxml/1" fx:controller=“line.main.Controller”> <!–其他布局元素–></BorderPane>然后可以在public void initialize(URL url, ResourceBundle resourceBundle) 方法内获取Stagepublic class Controller implements Initializable { public BorderPane root; private Stage stage; @Override public void initialize(URL url, ResourceBundle resourceBundle) { var stage = getStage(); } private Stage getStage() { if (stage == null) { stage = (Stage) root.getScene().getWindow(); } return stage; }}自定义窗体移动与缩放逻辑记录鼠标坐标 root.setOnMousePressed(event -> { event.consume(); xOffset = event.getSceneX(); yOffset = event.getSceneY(); });自定义移动控制区域dragArea.setOnMouseDragged(event -> { event.consume(); var stage = getStage(); stage.setX(event.getScreenX() - xOffset); stage.setY(event.getScreenY() - yOffset); });判断鼠标坐标位置,并处理光标变换root.setOnMouseMoved(this::mouseMoveHandle); private void mouseMoveHandle(MouseEvent event) { event.consume(); double x = event.getSceneX(); double y = event.getSceneY(); var stage = getStage(); double width = stage.getWidth(); double height = stage.getHeight(); Cursor cursorType = Cursor.DEFAULT; bit = 0; if (y >= height - RESIZE_WIDTH) { if (x <= RESIZE_WIDTH) { bit |= 1 << 3; } else if (x >= width - RESIZE_WIDTH) { bit |= 1; bit |= 1 << 2; cursorType = Cursor.SE_RESIZE; } else { bit |= 1; cursorType = Cursor.S_RESIZE; } } else if (x >= width - RESIZE_WIDTH) { bit |= 1 << 2; cursorType = Cursor.E_RESIZE; } root.setCursor(cursorType); }处理窗口缩放root.setOnMouseDragged(this::mouseDraggedHandle);private void mouseDraggedHandle(MouseEvent event) { event.consume(); var primaryStage = getStage(); double x = event.getSceneX(); double y = event.getSceneY(); double nextX = primaryStage.getX(); double nextY = primaryStage.getY(); double nextWidth = primaryStage.getWidth(); double nextHeight = primaryStage.getHeight(); if ((bit & 1 << 2) != 0) { nextWidth = x; } if ((bit & 1) != 0) { nextHeight = y; } if (nextWidth <= MIN_WIDTH) { nextWidth = MIN_WIDTH; } if (nextHeight <= MIN_HEIGHT) { nextHeight = MIN_HEIGHT; } primaryStage.setX(nextX); primaryStage.setY(nextY); primaryStage.setWidth(nextWidth); primaryStage.setHeight(nextHeight);}完整代码package line.main;import javafx.fxml.Initializable;import javafx.scene.Cursor;import javafx.scene.input.MouseEvent;import javafx.scene.layout.BorderPane;import javafx.scene.layout.Pane;import javafx.stage.Stage;import java.net.URL;import java.util.ResourceBundle;public class Controller implements Initializable { public BorderPane root; public Pane dragArea; private Stage stage; private double xOffset = 0; private double yOffset = 0; private int bit = 0;//left,right,top,bottom private static final double RESIZE_WIDTH = 5.00; private static final double MIN_WIDTH = 600.00; private static final double MIN_HEIGHT = 400.00; @Override public void initialize(URL url, ResourceBundle resourceBundle) { dragArea.setOnMouseDragged(event -> { event.consume(); var stage = getStage(); stage.setX(event.getScreenX() - xOffset); stage.setY(event.getScreenY() - yOffset); }); root.setOnMousePressed(event -> { event.consume(); xOffset = event.getSceneX(); yOffset = event.getSceneY(); }); root.setOnMouseMoved(this::mouseMoveHandle); root.setOnMouseDragged(this::mouseDraggedHandle); } private Stage getStage() { if (stage == null) { stage = (Stage) root.getScene().getWindow(); } return stage; } private void mouseMoveHandle(MouseEvent event) { event.consume(); double x = event.getSceneX(); double y = event.getSceneY(); var stage = getStage(); double width = stage.getWidth(); double height = stage.getHeight(); Cursor cursorType = Cursor.DEFAULT; bit = 0; if (y >= height - RESIZE_WIDTH) { if (x <= RESIZE_WIDTH) { bit |= 1 << 3; } else if (x >= width - RESIZE_WIDTH) { bit |= 1; bit |= 1 << 2; cursorType = Cursor.SE_RESIZE; } else { bit |= 1; cursorType = Cursor.S_RESIZE; } } else if (x >= width - RESIZE_WIDTH) { bit |= 1 << 2; cursorType = Cursor.E_RESIZE; } root.setCursor(cursorType); } private void mouseDraggedHandle(MouseEvent event) { event.consume(); var primaryStage = getStage(); double x = event.getSceneX(); double y = event.getSceneY(); double nextX = primaryStage.getX(); double nextY = primaryStage.getY(); double nextWidth = primaryStage.getWidth(); double nextHeight = primaryStage.getHeight(); if ((bit & 1 << 2) != 0) { nextWidth = x; } if ((bit & 1) != 0) { nextHeight = y; } if (nextWidth <= MIN_WIDTH) { nextWidth = MIN_WIDTH; } if (nextHeight <= MIN_HEIGHT) { nextHeight = MIN_HEIGHT; } primaryStage.setX(nextX); primaryStage.setY(nextY); primaryStage.setWidth(nextWidth); primaryStage.setHeight(nextHeight); }} ...

February 5, 2019 · 3 min · jiezi