Java FX swt_DOC-13-08 JavaFX与SWT的协作性

本文档展示了如何在SWT应用程序中集成JavaFX,通过一个实例演示了SWT和JavaFX控件的协作,创建了一个SWT按钮和JavaFX按钮,当点击任一按钮时,另一按钮的文字会相应改变。JavaFX内容在FXCanvas上展示,并通过事件监听实现交互效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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按钮在右

e88827b0f48c450d9fae179525884dac.png

当用户点击任何一个按钮时,另一个按钮上的文字会改变,如图8-2和图8-3所示。本例展示了SWT代码和JavaFX代码是如何协作的。

图8-2点击SWT按钮改变JavaFX按钮标签

9547ff8ee545ac5c713d6159b7a13f3d.png

图8-3点击JavaFX按钮改变SWT按钮标签

e825296a538c75c1e6d0675982a8c396.png

在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场景图

c2a37100a9d4c9165dceb4aaeebdb154.png

例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项目

打赏一下

支付宝

微信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值