DOC-13-08 JavaFX与SWT的协作性
本章展示了如何在SWT应用程序中加入一个JavaFX场景图,以及如何使SWT和JavaFX控件协作。
介绍
如果你开发SWT应用程序,你知道SWT使用本地操作系统的控件,而且并不能简单的配置来使用高级GUI特性,比如动画。在SWT中集成JavaFX可以很快的让你的SWT应用程序变炫。你只需要javafx.embed.swt包中的FXCanvas类。javafx.embed.swt包可以在jfxswt.jar中找到,位于JDK_Home/jre/lib/路径中。FXCanvas是一个常规的SWT画布,只要是SWT画布能出现的地方,它都可以用。
在本章中,你将看到如何创建一个交互式的SWT按钮和JavaFX按钮,如图8-1所示。
图8-1 SWT按钮在左,JavaFX按钮在右
当用户点击任何一个按钮时,另一个按钮上的文字会改变,如图8-2和图8-3所示。本例展示了SWT代码和JavaFX代码是如何协作的。
图8-2点击SWT按钮改变JavaFX按钮标签
图8-3点击JavaFX按钮改变SWT按钮标签
在SWT组件中添加JavaFX内容
在JavaFX中,创建和操作JavaFX类的Java代码在JavaFX用户线程进程中运行。在SWT中,创建和操作SWT小部件的代码在事件循环线程中运行。当在SWT中嵌入JavaFX时,这两个线程是同一个。这意味着在一个工具中调用另一个工具的方法时没有任何限制。
例8-1展示了创建如图8-1所示的SWT按钮和JavaFX按钮的代码。如代码中所示,你使用FXCanvas类的setScene()方法在一个FXCanvas中设置了JavaFX内容。为了强制SWT布局包含新JavaFX内容的画布,首先要调整JavaFX内容的大小。为了调整大小,获取包含JavaFX内容的JavaFX窗口并调用sizeToScene()。当JavaFX被嵌入到SWT时,会为FXCanvas设置一个新的预设大小,使SWT可以重新调整嵌入的JFX内容大小,正如调整其它SWT控件的大小一样。
JavaFX根据一个分层的场景图来构造内容,然后放入scene中。例8-1中的代码将JavaFX按钮放入了一个如图8-4所示的场景图中,在代码样例的备注中有描述。
图8-4在SWT应用程序中的JavaFX场景图
例8-1普通SWT和JavaFX按钮的Java代码
Java
import javafx.embed.swt.FXCanvas;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.paint.Color;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class TwoButtons {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
final RowLayout layout = new RowLayout();
shell.setLayout(layout);
/* Create the SWT button */
final org.eclipse.swt.widgets.Button swtButton =
new org.eclipse.swt.widgets.Button(shell, SWT.PUSH);
swtButton.setText("SWT Button");
/* Create an FXCanvas */
final FXCanvas fxCanvas = new FXCanvas(shell, SWT.NONE) {
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
getScene().getWindow().sizeToScene();
int width = (int) getScene().getWidth();
int height = (int) getScene().getHeight();
return new Point(width, height);
}
};
/* Create a JavaFX Group node */
Group group = new Group();
/* Create a JavaFX button */
final Button jfxButton = new Button("JFX Button");
/* Assign the CSS ID ipad-dark-grey */
jfxButton.setId("ipad-dark-grey");
/* Add the button as a child of the Group node */
group.getChildren().add(jfxButton);
/* Create the Scene instance and set the group node as root */
Scene scene = new Scene(group, Color.rgb(
shell.getBackground().getRed(),
shell.getBackground().getGreen(),
shell.getBackground().getBlue()));
/* Attach an external stylesheet */
scene.getStylesheets().add("twobuttons/Buttons.css");
fxCanvas.setScene(scene);
/* Add Listeners */
swtButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
jfxButton.setText("JFX Button: Hello from SWT");
shell.layout();
}
});
jfxButton.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent event) {
swtButton.setText("SWT Button: Hello from JFX");
shell.layout();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
importjavafx.embed.swt.FXCanvas;
importjavafx.event.ActionEvent;
importjavafx.event.EventHandler;
importjavafx.scene.Group;
importjavafx.scene.Scene;
importjavafx.scene.control.Button;
importjavafx.scene.paint.Color;
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.graphics.Point;
importorg.eclipse.swt.layout.RowLayout;
importorg.eclipse.swt.widgets.Display;
importorg.eclipse.swt.widgets.Event;
importorg.eclipse.swt.widgets.Listener;
importorg.eclipse.swt.widgets.Shell;
publicclassTwoButtons{
publicstaticvoidmain(String[]args){
finalDisplaydisplay=newDisplay();
finalShellshell=newShell(display);
finalRowLayoutlayout=newRowLayout();
shell.setLayout(layout);
/* Create the SWT button */
finalorg.eclipse.swt.widgets.ButtonswtButton=
neworg.eclipse.swt.widgets.Button(shell,SWT.PUSH);
swtButton.setText("SWT Button");
/* Create an FXCanvas */
finalFXCanvasfxCanvas=newFXCanvas(shell,SWT.NONE){
@Override
publicPointcomputeSize(intwHint,inthHint,booleanchanged){
getScene().getWindow().sizeToScene();
intwidth=(int)getScene().getWidth();
intheight=(int)getScene().getHeight();
returnnewPoint(width,height);
}
};
/* Create a JavaFX Group node */
Groupgroup=newGroup();
/* Create a JavaFX button */
finalButtonjfxButton=newButton("JFX Button");
/* Assign the CSS ID ipad-dark-grey */
jfxButton.setId("ipad-dark-grey");
/* Add the button as a child of the Group node */
group.getChildren().add(jfxButton);
/* Create the Scene instance and set the group node as root */
Scenescene=newScene(group,Color.rgb(
shell.getBackground().getRed(),
shell.getBackground().getGreen(),
shell.getBackground().getBlue()));
/* Attach an external stylesheet */
scene.getStylesheets().add("twobuttons/Buttons.css");
fxCanvas.setScene(scene);
/* Add Listeners */
swtButton.addListener(SWT.Selection,newListener(){
@Override
publicvoidhandleEvent(Eventevent){
jfxButton.setText("JFX Button: Hello from SWT");
shell.layout();
}
});
jfxButton.setOnAction(newEventHandler(){
@Override
publicvoidhandle(ActionEventevent){
swtButton.setText("SWT Button: Hello from JFX");
shell.layout();
}
});
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}
在IDE中创建SWT-JavaFX应用程序
在一个IDE中创建一个SWT-JavaFX应用程序很简单,在你的工程中加入如下库即可:
jfxswt.jar,在JDK_HOME/jre/lib路径中:
例如,在Windows默认的JDK安装中,完整路径为:C:\Program Files\Java\jdk1.8.0\jre\lib
注意:根据你的环境,确保所用的JAR文件都是32位或者64位的。
打包SWT-JavaFX应用程序
关于你如何打包你的SWT-JavaFX应用程序,这基于JavaFX是否绑定在JDK(7u6或更高级)中或是安装在不同的位置(7u6之前的版本)。
当JavaFX绑定在JDK中时打包应用程序
如果你使用NetBeans IDE 7.2或更高级,且已经添加了如“在IDE中创建SWT-JavaFX应用程序”一节中所描述的库,你不需要特别的操作来打包应用程序。你可以简单的Clean并Build,在工程的/dist路径中双击JAR文件来运行。
在独立安装的JavaFX中打包应用程序
当SWT-JavaFX应用程序创建完毕时,JAR文件必须打包为JavaFX应用,如此应用程序启动时才能在用户的系统查找独立安装的JavaFX运行时环境。SWT库(swt.jar)必须作为一个资源被包含进来(根据目标系统选择32位或64位)
应用程序资源
NetBeans项目
打赏一下
支付宝
微信