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 ,