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相关推荐

  1. JDK11使用IDEA,配置JavaFX

    JDK11使用IDEA,配置JavaFX 1.下载javaFX相关的包 2.在实际Demo中试验哪里少了添加哪里 导入lib文件夹,之后点击OK 配置VMoption 配置成功 3.运行,大功告成 1 ...

  2. JavaFX项目jar使用javafxpackager生成exe

    2019独角兽企业重金招聘Python工程师标准>>> JavaFX项目jar使用javafxpackager生成exe 编译JavaFX生成可执行jar 新建文件夹test1,将第 ...

  3. 像素颜色JavaFX示例--简易图片处理工具

    文章结束给大家来个序程员笑话:[M] 声明:   本博客文章原创类别的均为个人原创,版权所有.载转请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http:/ ...

  4. javaFX中解决填充(拉伸)问题

    1.margin设置实现 在项目过程中,遇到此问题,如图: 如果窗口缩小,HBox(左边的包含TitledPane那部分)看不到底部 如果窗口拉大,下面就出现空白,HBox高度没拉神 办法:对包含HB ...

  5. TWaver Flex开发示例及license下载

    做电信项目的朋友一定知道TWaver,而Flex版具有很好的跨平台性,很适合做B/S模式的应用. Flex版的在线DEMO:http://twaver.servasoft.com/demo/twave ...

  6. JavaFX打包工具(javafxpackager)

    2019独角兽企业重金招聘Python工程师标准>>> 首先创建一个JavaFX文件,Hello World package test;import javafx.applicati ...

  7. javafx官方文档学习之二Scene体系学习一

    2019独角兽企业重金招聘Python工程师标准>>> 我的博文小站:http://www.xby1993.net,文章更新以博文小站为主,一般与oschina同步发布 原创文章,转 ...

  8. Silverlight、JavaFX、Flex技术比较

    Techie在他最近写的一篇博客中,从定义.大小.应用平台.授权许可等方面深入比较了这几种技术的不同. Silverlight是一个跨浏览器和跨平台的插件,能在微软的.NET上交付炫目的多媒体体验和有 ...

  9. java 属性自定义配置,将自定义FXML属性设置为自定义javafx组件的参数

    我创建了自定义组件TableBlock . 它由Label和TableView组成 . 例如,TableView可以有1到1000行 . 行数由FXML文件中的参数"rowsFromPref ...

最新文章

  1. word2vec中文类似词计算和聚类的使用说明及c语言源代码
  2. 亚型多态性应用于元组的危险
  3. 我的Go+语言初体验——(3)Go+ 语言数据类型
  4. 华为手机媒体音量自动静音_华为手机的音量键原来这么牛逼,这五大玩法,97.777%的人不知道...
  5. python messagebox弹窗退出_python 中messagebox使用 做中断调试不错
  6. 熬了整整30天,java递归阶乘求和
  7. java编写八数码_java实现八数码
  8. python中0o10_Python中最常见的10个问题(列表)
  9. Linux 金字塔 的shell命令,shell脚本编程设计——根据输入的数输出菱形、三角形或者数字金字塔(带闪烁颜色)...
  10. 201521123033《Java程序设计》第3周学习总结
  11. 今日头条视频去重复上传方法-网络营销推广教程 如何完美去除视频字幕和LOGO批量下载快手西瓜视频...
  12. vue仿追书神器,vue小说项目源码
  13. qtableview 查询_【转】QTableView显示数据库
  14. ORACLE11g数据库安装-刘建-专题视频课程
  15. Java ThreadLocalRandom 伪随机数生成器的源码深度解析与应用
  16. mdf文件和ldf文件ndf是什么,怎么用?如何给SQL server添加数据文件?分离和附加数据库的操作
  17. 程序员约架事件中,薛非到底是因为不会用Github还是不会写Tokenizer而没有应战?...
  18. 利用CASS使用三种方法计算两期土方
  19. 笔记本选购2018.9
  20. python编程读写文件内容_Python编程中对文件和存储器的读写示例

热门文章

  1. 九九乘法表下半三角(C语言)
  2. FFmpeg命令的几种应用
  3. 帧间差分法_OpenCV_详解
  4. Python Pycharm 配置Tips01 - 配置Pycharm的Python版本
  5. 微信小程序 - 实践- 001-实现一个多TAB的菜单框架
  6. python输入姓名_Python 用户输入用户名,进行验证
  7. 乱码 设置界面_三星手机突发系统崩溃,现黑屏、乱码!回应了
  8. java高级规范_Java高级规范之二
  9. java aop注解日志记录_spring aop通过注解实现日志记录
  10. u盘安装linux 7.4,U盘自动化安装CentOS7.4