TWaver With JavaFX
JavaFX Script被抛弃以后,很久不关心JavaFX了,偶然发现JavaFX已经发展到2.2,而且已经绑定到JDK7中,看来Oracle对它还是蛮重视的。
看到有人在论坛提问TWaver有没有JavaFX版本,于是去Oracle网站上逛了一下,发现可以将JavaFX集成进Swing程序中,真是福音啊,立马动手写了个Demo,集成起来还是很方便的。
运行效果
代码分析
窗体中间是个很典型的Network,上下各是一个JavaFX容器,上面容器中包含一个Slider,滑动时可以改变TWaver选中Node的RenderColor,下面的容器中包含一些Text,选中Network中的Node并拖动的时候在Text组件上显示Node的name和location。
在这个Demo里,程序架构还是Swing,JavaFX提供了一个名为JFXPanel的组件可以嵌入到Swing容器中,JFXPanel内可以放JavaFX的组件,需要注意,Swing和JavaFX的线程不同,官方的原文是:"JavaFX data should be accessed only on the JavaFX User thread","Swing data should be changed only on the EDT",所以如果要在Swing中修改JavaFX的数据,应该使用Platform#runLater包装,本例中,拖动Node时修改JavaFX的Text组件的相关代码:
network.getDataBox().addElementPropertyChangeListener(new PropertyChangeListener() {@Overridepublic void propertyChange(PropertyChangeEvent evt) {if("location".equals(evt.getPropertyName())){Element element= (Element) evt.getSource();final String name=element.getName();final double x=element.getX();final double y=element.getY();Platform.runLater(new Runnable() {@Overridepublic void run() {nameText.setText(name);locationText.setText("X:"+x+" Y:"+y);}});}}});
同样,如果要在JavaFX中修改Swing数据,也要用SwingUtilities#invokeLater包装,本例中,滑动Slider修改选中Node的Render Color代码如下:
slider.valueProperty().addListener(new ChangeListener<Number>() {public void changed(ObservableValue<? extends Number> ov,Number old_val,final Number new_val) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {Iterator it=network.getSelectionModel().selection();while (it.hasNext()){Element element= (Element) it.next();element.putRenderColor(new java.awt.Color(new_val.intValue()));}}});}});
最后附上全部代码:
public class Test1 {static TNetwork network;static Text nameText;static Text locationText;static Slider slider;private static void initAndShowGUI() {initNetwork();JFrame frame = new JFrame("TWaver With JavaFX");frame.getContentPane().setLayout(new BorderLayout());frame.setSize(500, 300);frame.setVisible(true);frame.getContentPane().add(network);final JFXPanel controlFXPanel = new JFXPanel();frame.add(controlFXPanel,BorderLayout.NORTH);final JFXPanel statusFXPanel = new JFXPanel();frame.add(statusFXPanel,BorderLayout.SOUTH);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);network.getDataBox().addElementPropertyChangeListener(new PropertyChangeListener() {@Overridepublic void propertyChange(PropertyChangeEvent evt) {if("location".equals(evt.getPropertyName())){Element element= (Element) evt.getSource();final String name=element.getName();final double x=element.getX();final double y=element.getY();Platform.runLater(new Runnable() {@Overridepublic void run() {nameText.setText(name);locationText.setText("X:"+x+" Y:"+y);}});}}});Platform.runLater(new Runnable() {@Overridepublic void run() {initFX(statusFXPanel,controlFXPanel);}});}private static void initNetwork(){network=new TNetwork();twaver.Node node1=new Node();node1.setName("node1");twaver.Node node2=new Node();node2.setLocation(200,100);node2.setName("node2");Link link=new Link(node1,node2);network.getDataBox().addElement(node1);network.getDataBox().addElement(node2);network.getDataBox().addElement(link);}private static void initFX(JFXPanel statusFXPanel,JFXPanel controlFXPanel) {Scene scene = createStatusScene();statusFXPanel.setScene(scene);statusFXPanel.validate();Scene controlScene=createControlScene();controlFXPanel.setScene(controlScene);controlFXPanel.validate();}private static Scene createControlScene(){Group root = new Group();Scene scene = new Scene(root, Color.ALICEBLUE);HBox hbox=new HBox();slider =new Slider(0,16777215,0);slider.setPrefHeight(30);slider.setPrefWidth(300);slider.valueProperty().addListener(new ChangeListener<Number>() {public void changed(ObservableValue<? extends Number> ov,Number old_val, final Number new_val) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {Iterator it = network.getSelectionModel().selection();while (it.hasNext()) {Element element = (Element) it.next();element.putRenderColor(new java.awt.Color(new_val.intValue()));}}});}});Label label=new Label("颜色:");label.setPrefHeight(30);hbox.getChildren().add(label);hbox.getChildren().add(slider);root.getChildren().add(hbox);return scene;}private static Scene createStatusScene() {Group root = new Group();Scene scene = new Scene(root, Color.ALICEBLUE);VBox vbox=new VBox();vbox.setPrefWidth(300);vbox.setPrefHeight(20);HBox hbox=new HBox();nameText=new Text();hbox.getChildren().add(new Label(" Name:"));hbox.getChildren().add(nameText);hbox.getChildren().add(new Text(" "));locationText=new Text();hbox.getChildren().add(new Label("Location:"));hbox.getChildren().add(locationText);vbox.getChildren().add(hbox);root.getChildren().add(vbox);return (scene);}public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {initAndShowGUI();}});}
}
转载于:https://www.cnblogs.com/twaver/archive/2012/09/26/2703700.html
TWaver With JavaFX相关推荐
- JDK11使用IDEA,配置JavaFX
JDK11使用IDEA,配置JavaFX 1.下载javaFX相关的包 2.在实际Demo中试验哪里少了添加哪里 导入lib文件夹,之后点击OK 配置VMoption 配置成功 3.运行,大功告成 1 ...
- JavaFX项目jar使用javafxpackager生成exe
2019独角兽企业重金招聘Python工程师标准>>> JavaFX项目jar使用javafxpackager生成exe 编译JavaFX生成可执行jar 新建文件夹test1,将第 ...
- 像素颜色JavaFX示例--简易图片处理工具
文章结束给大家来个序程员笑话:[M] 声明: 本博客文章原创类别的均为个人原创,版权所有.载转请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http:/ ...
- javaFX中解决填充(拉伸)问题
1.margin设置实现 在项目过程中,遇到此问题,如图: 如果窗口缩小,HBox(左边的包含TitledPane那部分)看不到底部 如果窗口拉大,下面就出现空白,HBox高度没拉神 办法:对包含HB ...
- TWaver Flex开发示例及license下载
做电信项目的朋友一定知道TWaver,而Flex版具有很好的跨平台性,很适合做B/S模式的应用. Flex版的在线DEMO:http://twaver.servasoft.com/demo/twave ...
- JavaFX打包工具(javafxpackager)
2019独角兽企业重金招聘Python工程师标准>>> 首先创建一个JavaFX文件,Hello World package test;import javafx.applicati ...
- javafx官方文档学习之二Scene体系学习一
2019独角兽企业重金招聘Python工程师标准>>> 我的博文小站:http://www.xby1993.net,文章更新以博文小站为主,一般与oschina同步发布 原创文章,转 ...
- Silverlight、JavaFX、Flex技术比较
Techie在他最近写的一篇博客中,从定义.大小.应用平台.授权许可等方面深入比较了这几种技术的不同. Silverlight是一个跨浏览器和跨平台的插件,能在微软的.NET上交付炫目的多媒体体验和有 ...
- java 属性自定义配置,将自定义FXML属性设置为自定义javafx组件的参数
我创建了自定义组件TableBlock . 它由Label和TableView组成 . 例如,TableView可以有1到1000行 . 行数由FXML文件中的参数"rowsFromPref ...
最新文章
- word2vec中文类似词计算和聚类的使用说明及c语言源代码
- 亚型多态性应用于元组的危险
- 我的Go+语言初体验——(3)Go+ 语言数据类型
- 华为手机媒体音量自动静音_华为手机的音量键原来这么牛逼,这五大玩法,97.777%的人不知道...
- python messagebox弹窗退出_python 中messagebox使用 做中断调试不错
- 熬了整整30天,java递归阶乘求和
- java编写八数码_java实现八数码
- python中0o10_Python中最常见的10个问题(列表)
- Linux 金字塔 的shell命令,shell脚本编程设计——根据输入的数输出菱形、三角形或者数字金字塔(带闪烁颜色)...
- 201521123033《Java程序设计》第3周学习总结
- 今日头条视频去重复上传方法-网络营销推广教程 如何完美去除视频字幕和LOGO批量下载快手西瓜视频...
- vue仿追书神器,vue小说项目源码
- qtableview 查询_【转】QTableView显示数据库
- ORACLE11g数据库安装-刘建-专题视频课程
- Java ThreadLocalRandom 伪随机数生成器的源码深度解析与应用
- mdf文件和ldf文件ndf是什么,怎么用?如何给SQL server添加数据文件?分离和附加数据库的操作
- 程序员约架事件中,薛非到底是因为不会用Github还是不会写Tokenizer而没有应战?...
- 利用CASS使用三种方法计算两期土方
- 笔记本选购2018.9
- python编程读写文件内容_Python编程中对文件和存储器的读写示例
热门文章
- 九九乘法表下半三角(C语言)
- FFmpeg命令的几种应用
- 帧间差分法_OpenCV_详解
- Python Pycharm 配置Tips01 - 配置Pycharm的Python版本
- 微信小程序 - 实践- 001-实现一个多TAB的菜单框架
- python输入姓名_Python 用户输入用户名,进行验证
- 乱码 设置界面_三星手机突发系统崩溃,现黑屏、乱码!回应了
- java高级规范_Java高级规范之二
- java aop注解日志记录_spring aop通过注解实现日志记录
- u盘安装linux 7.4,U盘自动化安装CentOS7.4