当前位置:编程学习 > JAVA >>

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组件的相关代码:

 1 network.getDataBox().addElementPropertyChangeListener(new PropertyChangeListener() {
 2             @Override
 3             public void propertyChange(PropertyChangeEvent evt) {
 4                 if("location".equals(evt.getPropertyName())){
 5                     Element element= (Element) evt.getSource();
 6                     final String name=element.getName();
 7                     final double x=element.getX();
 8                     final double y=element.getY();
 9                     Platform.runLater(new Runnable() {
10                         @Override
11                         public void run() {
12                             nameText.setText(name);
13                             locationText.setText("X:"+x+"   Y:"+y);
14                         }
15                     });
16                 }
17             }
18         });

同样,如果要在JavaFX中修改Swing数据,也要用SwingUtilities#invokeLater包装,本例中,滑动Slider修改选中Node的Render Color代码如下:

 1 slider.valueProperty().addListener(new ChangeListener<Number>() {
 2             public void changed(ObservableValue<? extends Number> ov,
 3                                 Number old_val,final Number new_val) {
 4                 SwingUtilities.invokeLater(new Runnable() {
 5                     @Override
 6                     public void run() {
 7                         Iterator it=network.getSelectionModel().selection();
 8                         while (it.hasNext()){
 9                             Element element= (Element) it.next();
10                             element.putRenderColor(new java.awt.Color(new_val.intValue()));
11                         }
12                     }
13                 });
14             }
15         });

最后附上全部代码:

  1 public class Test1 {
  2     static TNetwork network;
  3     static Text nameText;
  4     static Text locationText;
  5     static  Slider slider;
  6     private static void initAndShowGUI() {
  7         initNetwork();
  8         JFrame frame = new JFrame("TWaver With JavaFX");
  9         frame.getContentPane().setLayout(new BorderLayout());
 10
 11         frame.setSize(500, 300);
 12         frame.setVisible(true);
 13         frame.getContentPane().add(network);
 14
 15         final JFXPanel controlFXPanel = new JFXPanel();
 16         frame.add(controlFXPanel,BorderLayout.NORTH);
 17
 18         final JFXPanel statusFXPanel = new JFXPanel();
 19         frame.add(statusFXPanel,BorderLayout.SOUTH);
 20
 21         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 22         network.getDataBox().addElementPropertyChangeListener(new PropertyChangeListener() {
 23           

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,