TWaver - 专注UI技术

http://twaver.servasoft.com/
posts - 171, comments - 191, trackbacks - 0, articles - 2
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

TWaver With JavaFX

Posted on 2012-09-26 10:38 TWaver 阅读(1194) 评论(0)  编辑  收藏
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             @Override
 24             public void propertyChange(PropertyChangeEvent evt) {
 25                 if("location".equals(evt.getPropertyName())){
 26                     Element element= (Element) evt.getSource();
 27                     final String name=element.getName();
 28                     final double x=element.getX();
 29                     final double y=element.getY();
 30                     Platform.runLater(new Runnable() {
 31                         @Override
 32                         public void run() {
 33                             nameText.setText(name);
 34                             locationText.setText("X:"+x+"   Y:"+y);
 35                         }
 36                     });
 37                 }
 38             }
 39         });
 40         Platform.runLater(new Runnable() {
 41             @Override
 42             public void run() {
 43                 initFX(statusFXPanel,controlFXPanel);
 44             }
 45         });
 46     }
 47     private static void initNetwork(){
 48         network=new TNetwork();
 49         twaver.Node node1=new Node();
 50         node1.setName("node1");
 51         twaver.Node node2=new Node();
 52         node2.setLocation(200,100);
 53         node2.setName("node2");
 54         Link link=new Link(node1,node2);
 55         network.getDataBox().addElement(node1);
 56         network.getDataBox().addElement(node2);
 57         network.getDataBox().addElement(link);
 58 
 59     }
 60     private static void initFX(JFXPanel statusFXPanel,JFXPanel controlFXPanel) {
 61         Scene scene = createStatusScene();
 62         statusFXPanel.setScene(scene);
 63         statusFXPanel.validate();
 64 
 65         Scene controlScene=createControlScene();
 66         controlFXPanel.setScene(controlScene);
 67         controlFXPanel.validate();
 68 
 69     }
 70     private static Scene createControlScene(){
 71         Group  root  =  new  Group();
 72         Scene  scene  =  new  Scene(root, Color.ALICEBLUE);
 73         HBox hbox=new HBox();
 74         slider =new Slider(0,16777215,0);
 75         slider.setPrefHeight(30);
 76         slider.setPrefWidth(300);
 77         slider.valueProperty().addListener(new ChangeListener<Number>() {
 78             public void changed(ObservableValue<? extends Number> ov,
 79                                 Number old_val, final Number new_val) {
 80                 SwingUtilities.invokeLater(new Runnable() {
 81                     @Override
 82                     public void run() {
 83                         Iterator it = network.getSelectionModel().selection();
 84                         while (it.hasNext()) {
 85                             Element element = (Element) it.next();
 86                             element.putRenderColor(new java.awt.Color(new_val.intValue()));
 87                         }
 88                     }
 89                 });
 90             }
 91         });
 92         Label label=new Label("颜色:");
 93         label.setPrefHeight(30);
 94         hbox.getChildren().add(label);
 95         hbox.getChildren().add(slider);
 96         root.getChildren().add(hbox);
 97         return scene;
 98     }
 99     private static Scene createStatusScene() {
100         Group  root  =  new  Group();
101         Scene  scene  =  new  Scene(root, Color.ALICEBLUE);
102         VBox vbox=new VBox();
103         vbox.setPrefWidth(300);
104         vbox.setPrefHeight(20);
105         HBox hbox=new HBox();
106         nameText=new Text();
107         hbox.getChildren().add(new Label("  Name:"));
108         hbox.getChildren().add(nameText);
109         hbox.getChildren().add(new Text("   "));
110         locationText=new Text();
111         hbox.getChildren().add(new Label("Location:"));
112         hbox.getChildren().add(locationText);
113         vbox.getChildren().add(hbox);
114         root.getChildren().add(vbox);
115         return (scene);
116     }
117 
118     public static void main(String[] args) {
119         SwingUtilities.invokeLater(new Runnable() {
120             @Override
121             public void run() {
122                 initAndShowGUI();
123             }
124         });
125     }
126 }

只有注册用户登录后才能发表评论。


网站导航: