前言
JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。
组成结构
- javaFX基础(javaFX系列之launcher启动器:两种启动javaFX的方式及launch(args[])参数设置和获取)
- 窗体(javaFX2.0窗体(Stage)分析及使用)
- 场景(javaFX2.0场景(Scene)分析及使用)
- 布局
- UI组件
- 2D/3D图形系统(windows vista以下使用directx 9.0,windows7使用directx 11.0,macos/linux使用opengl)
- 多媒体(音视频)(javaFX系列之media:最简单的javaFX视频播放器实现)
- 视觉特效
- web组件(javaFX系列之web组件:最简单的javaFX浏览器实现)
- css层叠样式表(支持css2.0和少量css3.0
- 其他
- JavaFX线程结构分析
窗体功能
javaFX通过Stage提供了窗体的一些控制功能,提供了诸如设置窗体大小、全屏、全屏快捷键设置、聚焦、保持最上方,显示,隐藏等等常见的窗体功能。
而Stage只有在JavaFX Application线程中才能够得到并且进行控制,查看了javaFX的源码,发现JavaFX对窗体控制进行了线程检查,只允许JavaFX Application线程进行控制,其他线程是无法对javaFX的窗体进行控制和调用。
javaFX线程结构分析请参考第一篇文章:javaFX2.0线程结构分析
窗体演示代码
真的开始使用JavaFX才会发现JavaFX的窗体设计很不灵活,限制极多,比如节点只能在javaFX线程中才能进行创建,其他线程不允许操作窗体Stage等等。当然这里有设计者自己的考量,比如官方文档注释说明这是为了保证javafx线程对于窗体的独占性,防止像之前awt那样出现线程问题。但是再博主使用了一段时间来看,这种解决一个问题又出现了更多的问题的解决方案,显然并不太合适,不仅大大的增加了其他线程对于窗体控制的复杂度,还带来了更加复杂的代码结构,无疑这是得不偿失的,希望后面的版本会进一步优化。
public class StageDemo extends Application {
double minWidth=800,minHeight=600;
static Stage stage;//窗体,想要操作该窗体的api,必须再javaFX Application线程中执行,其他线程执行会抛出异常。
public static Scene scene;//场景,场景必须在窗体Stage初始化后才能创建,只有在javaFX launcher线程的 init()方法和javaFX Application线程中才能进行创建,其他线程会抛出异常。
String title="eguid的窗体Stage功能演示,转载请注明出处和作者名,blog 。 eguid . cc原创技术文章";
@Override
public void init() throws Exception {
Console.log("窗体打开之前的一些初始化,当前线程:"+Thread.currentThread().getName());Group root=new Group();
scene=new Scene(root, 2000,2000,Color.WHITE);//场景不能在
super.init();
}@Override
public void start(Stage primaryStage) throws Exception {
Console.log("打开窗体,当前线程:"+Thread.currentThread().getName());
stage=primaryStage;
primaryStage.setScene(scene);
Console.log(scene);
// 舞台/窗体
primaryStage.setTitle(title);
// 设置窗体最大最小范围,防止窗口过小和过大。
primaryStage.setMinWidth(minWidth);
primaryStage.setMinHeight(minHeight);//获取当前屏幕最大分辨率,自行实现的工具
int maxWidth = ScreenUtil.getWidth(), maxHeight = ScreenUtil.getHeight();
primaryStage.setMaxWidth(maxWidth);//设置最大宽度
primaryStage.setMaxHeight(maxHeight);//设置最大高度
Console.log("最大分辨率:" + maxWidth + "," + maxHeight);
//设置退出全屏快捷键
primaryStage.setFullScreenExitKeyCombination(new KeyCombination() {
@Override
public boolean match(KeyEvent event) {
String name=event.getCode().getName();
Console.log("按键名称:"+name);
return super.match(event);
}
});
primaryStage.setFullScreen(true);//全屏
primaryStage.setResizable(true);//允许自由调整窗体大小
primaryStage.setFocused(true);//聚焦
primaryStage.setAlwaysOnTop(true);//保持窗体再最上方
primaryStage.show();//显示窗体
}@Override
public void stop() throws Exception {
Console.log("关闭窗体,当前线程:"+Thread.currentThread().getName());
super.stop();
}public static void main(String[] args) {
Console.log("启动程序");
Application.launch(args);
}}