分类: JAVAFX技术.
标签: java, JavaFX, swing, 菜单
在JavaFX的API中没有提供菜单(menu)的控件。可能是由于JavaFX设计者们觉得在RIA有没有菜单不重要。但实际中,开发人员还是常常询问如何在JavaFX实现菜单功能,于是Henry决定写个JavaFX菜单的例子(更多的例子可以参考 JavaFX编程博客 http://www.javafxblogs.com)。
JavaFX最然没有直接提供Menu的功能(注:javafxblogs.com),但是提供了一个SWING组件的封装类javafx.ext.swing.SwingComponent。这个类可以把SWING的组件转化成JavaFX的节点(node)。


在上述代码中,我们先用构建一套标准的SWING菜单条(menu bar,JavaFX教程 http://www.javafxblogs.com),每个菜单条包含2个菜单项。这些都是标准Java SE中的功能,就不多解释了。接下来我们用以下语句来创建一个SwingComponent实例, 把SWING的菜单条包容进去:
var fxMenuBar : SwingComponent = SwingComponent.wrap(menuBar);
下面3行代码是把菜单条定位在窗口的上方:
fxMenuBar.width = w;
fxMenuBar.layoutX=0;
fxMenuBar.layoutY=0;
在Stage类中,我们可以看到fxMenuBar就像不同的JavaFX节点一样使用。由于窗口式可以调整大小的,因此我们需要一些代码来保证菜单条和窗口等宽。为了实现这点,我们增加了一个trigger,把窗口宽度的变化反映到菜单条中,变量w的trigger如下:
var w : Number = 480 on replace { fxMenuBar.width = w ; };
实际的绑定是通过这句类完成的,注意这里的双向绑定的用法:
Stage {
...
width: bind w with inverse
...
}
下面是程序的截图,支持快捷键Alt+1,2,3,4来激活菜单项目:

相关文章:
SWING中如何使用JavaFX的组件
纯Java代码调用JavaFX的功能
NASCAR Die-cast
Free Online Canada Citizenship Practice Exam Questions on citizenship appliation
2009年07月28日
分类: JAVAFX技术, JavaFX技巧.
标签: java, JavaFX, swing
在文中注明:转自 http://www.javafxblogs.com 作者:Henry Zhang,即可获得授权转载.
自从JavaFX推出以来,如何在Java中调用JavaFX的功能就是个程序员常常讨论的问题。本人的文章用纯Java代码调用JavaFX的功能和JavaFX和Java之间的互操作性对此作过专题讨论。在开源项目JFXtras最近

JavaFX的代码,只有了解它的作用即可: ( 转自http://www.javafxblogs.com 作者:Henry Zhang )
/*
* MyScene.fx http://www.javafxblogs.com
* @author Henry Zhang
*/
package swingtest;
import javafx.scene.Scene;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.shape.Rectangle;
import javafx.animation.Timeline;
import javafx.animation.KeyFrame;
def w = 500;
def h = 400;
public class MyScene extends Scene {
var xx = w / 3;
var yy = h / 2;
var rotate = 0;
var text = "";
var tl = Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames : [
KeyFrame {
time: 70ms
action: function() {
text = JavaFXToSwingTest.tf.getText();
rotate = (rotate+5) mod 360;
}
}
]
}
override var content = [
Rectangle {
width: w, height: h
fill: Color.BLUE
},
Text {
font : Font {
size: 24
}
layoutX: bind xx
layoutY: bind yy
rotate: bind rotate
content: bind text
fill: Color.YELLOW
}
];
init { tl.play(); }
}
在文中注明:作者: Henry Zhang 转自 http://www.javafxblogs.com ,即可获得授权转载
在上面代码MyScene.fx中, 我们定义了一个Timeline实例来播放动画,在动画中,我们不断的使一行文本在旋转。每隔70ms,都会触发一次旋转角度的变化(每次5度)。为了演示如何在JavaFX和Java中交互数据,我们在每次更新时,从Java的静态变量中获取数据,代码如下:
text = JavaFXToSwingTest.tf.getText();
虽然这不是最佳的一种做法,但是我们暂时写成这样,使得不熟悉JavaFX的读者也能容易理解。稍后我们还会讨论这点。当我们完成了MyScene类后,可以开始写Java的主程序了,这是个标准的SWING程序JavaFXToSwingTest.java代码如下: ( 作者: Henry Zhang 转自 http://www.javafxblogs.com)
package swingtest;
/**
* JavaFXToSwingTest.java http://www.javafxblogs.com
* @author Henry Zhang
*/
import java.awt.*;
import javax.swing.*;
import org.jfxtras.scene.SceneToJComponent;
public class JavaFXToSwingTest extends JFrame {
public static JTextField tf = new JTextField("JavaFX for SWING");
public JavaFXToSwingTest() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("JavaFX in SWING Test");
Container container = getContentPane();
container.setLayout(new BorderLayout());
String sceneClass = "swingtest.MyScene";
JComponent myScene = SceneToJComponent.loadScene(sceneClass);
JLabel label = new JLabel(" Below is a JavaFX Animation: ");
container.add(label, BorderLayout.NORTH);
container.add(myScene, BorderLayout.CENTER);
JPanel p = new JPanel();
p.setLayout(new FlowLayout());
tf.setColumns(28);
p.add(tf);
p.add(new JButton("SWING Button"));
container.add(p, BorderLayout.SOUTH);
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(
new Runnable() {
public void run() {
new JavaFXToSwingTest().setVisible(true);
}
});
}
}
对大多数Java/Swing的程序员来说,上述代码应该是很容易理解的。我们通过 BorderLayout和FlowLayout在Swing的窗口(JFrame)中布置了一些图形控件。有2行代码是和加载JavaFX的Scene相关的:
String sceneClass = "swingtest.MyScene";
JComponent myScene = SceneToJComponent.loadScene(sceneClass);
其中SceneToJComponent类是从JFXtras项目中来的。它提供了loadScene()的方法,可以把JavaFX的Scene类加载到一个JComponent对象中, 从而可以被Swing程序使用。运行这个程序,你可以看到一行文本”JavaFX for SWING”在窗口中央旋转。如果你在输入框中输入新的句子,你会发现旋转的文字也发生了改变。你可以点击以下截图来启动一个Java Web Start的演示程序(JDK1.5以上),或者可以点击这里来观看演示的视频(需要有Windows Media Player)。
讨论
1) 在上述程序中,我们用JavaFX的代码去轮询Java的变量值,实际中这会损失比较多的性能,所以我们可以从Java代码中主动把数据变化通知JavaFX。这需要一种从Java调用javafx的技巧,可以参见本人文章:用Java代码调用JavaFX的功能 (http://www.javafxblogs.com/java-call-javafx-code/).
2) 在Swing程序中调用JavaFX是可行的,那么应该怎样编译和运行这样的程序呢。其实,JavaFX的功能也就是一些jar文件,因此和Java的结合方式还是比较简单的。编译的方法主要有两种,一种就是用JavaFX 的编译器javafxc来编译Java和JavaFX的代码。第二种就是用javafxc编译JavaFX代码,用javac编译java代码。运行程序的时候,我们可以选择javafx或java命令即可,可以参见本人文章:JavaFX技巧:纯Java代码调用JavaFX的例子的详细说明。
如果有什么问题,欢迎留言讨论。
2009年07月06日