TWaver - 專注UI技術(shù)

          http://twaver.servasoft.com/
          posts - 171, comments - 191, trackbacks - 0, articles - 2
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          TWaver With JavaFX

          Posted on 2012-09-26 10:38 TWaver 閱讀(1210) 評(píng)論(0)  編輯  收藏
          JavaFX Script被拋棄以后,很久不關(guān)心JavaFX了,偶然發(fā)現(xiàn)JavaFX已經(jīng)發(fā)展到2.2,而且已經(jīng)綁定到JDK7中,看來(lái)Oracle對(duì)它還是蠻重視的。 看到有人在論壇提問(wèn)TWaver有沒(méi)有JavaFX版本,于是去Oracle網(wǎng)站上逛了一下,發(fā)現(xiàn)可以將JavaFX集成進(jìn)Swing程序中,真是福音啊,立馬動(dòng)手寫了個(gè)Demo,集成起來(lái)還是很方便的。
          運(yùn)行效果

          代碼分析
          窗體中間是個(gè)很典型的Network,上下各是一個(gè)JavaFX容器,上面容器中包含一個(gè)Slider,滑動(dòng)時(shí)可以改變TWaver選中Node的RenderColor,下面的容器中包含一些Text,選中Network中的Node并拖動(dòng)的時(shí)候在Text組件上顯示Node的name和location。 在這個(gè)Demo里,程序架構(gòu)還是Swing,JavaFX提供了一個(gè)名為JFXPanel的組件可以嵌入到Swing容器中,JFXPanel內(nèi)可以放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的數(shù)據(jù),應(yīng)該使用Platform#runLater包裝,本例中,拖動(dòng)Node時(shí)修改JavaFX的Text組件的相關(guān)代碼:

           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數(shù)據(jù),也要用SwingUtilities#invokeLater包裝,本例中,滑動(dòng)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 }

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 修文县| 西贡区| 曲靖市| 同仁县| 阜新| 登封市| 南郑县| 衡阳县| 蒙自县| 定西市| 太仆寺旗| 保康县| 盐源县| 蓝山县| 常宁市| 通河县| 星子县| 阳泉市| 屯门区| 渝北区| 仁怀市| 左权县| 定结县| 柳江县| 杭州市| 革吉县| 怀远县| 陆丰市| 鸡东县| 石渠县| 汽车| 江西省| 康马县| 达拉特旗| 华容县| 萨嘎县| 泸西县| 礼泉县| 新津县| 新宁县| 东明县|