`

在Swing和Swt中使用JavaFX

 
阅读更多

本人从08年12月份,JavaFX发布第一个版本开始关注它的发展。


算算到现在,也差不多是第五个年头了。期间经历了一些动荡,但JavaFX还是坚持着发展了下来,也经历了很多改变(这也是Java技术的特点,不会像微软对技术的抛弃和更新换代很频繁),由以前顺应富互联网技术发展的单纯的JavaFX脚本语言,到现在已经变为完全用于取代Swing的技术。

虽然是为了取代Swing,但任何的技术为了不造成很大的影响,都必须有一个逐步换代的过程。如果单纯的从JDK中剔除Swing而增加JavaFX的话,将会造成世界数不清的程序无法运行,影响不可估量(就像JDK中有很多以前不合理的旧的类库,就算有新的可替代的方案,也不能将以前的完全删除,所以JDK其实越来越臃肿)。这里,我们将会介绍一下如何在Swing中使用JavaFX。


首先我们要明白,不管是Swing还是JavaFX,GUI的构建必须要各自的EDT(事件分发线程)中进行,这也是在其他线程中操作UI会出现error的原因。


而在JavaFX中,新增加了JFXPanel。这个组件是JavaFX和Swing进行混合编程的桥梁。

下面我们来看看JFXPanel的继承关系。


大家可以看到,JFXPanel是继承于JComponent的。而JavaFX的UI控件都是继承于javafx.scene.control.Control。所以很明显,它其实是一个Swing组件,而非JavaFX的组件。


下面我们来看看JPanel的继承关系。


继承关系基本相同,也就是说,凡是在使用JPanel的地方,我们都可以用JFXPanel来替代。JFXPanel中有一个setScene方法,可以设置其中显示的JavaFX内容。


根据文档介绍,setScene方法可以在Swing和JavaFX的EDT中使用。也可以说,setScene才是将JavaFX和Swing结合起来的关键。


不过由于JavaFX的GUI的构建也需要在JavaFX的事件分发线程中进行。所以我们还需要用到另外一个类Platform。

Platform.runLater(new Runnable())中间执行的是JavaFX的事件分发线程。我们可以在Runnable中进行JavaFX的UI的创建。


下面我们来看一个简单的示例-----在Swing中嵌入一个JavaFX的网页浏览器。


import java.awt.BorderLayout;
import java.awt.Toolkit;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

import javax.swing.JFrame;

public class MainClass {
	private static final int WIDTH = 800;
	private static final int HEIGHT = 600;
	private static final String url = "http://blog.csdn.net/ml3947";
	private static final String urlStart = "http://";

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame frame = new JFrame("JavaFX in Swing");
		final JFXPanel webBrowser = new JFXPanel();
		frame.setLayout(new BorderLayout());
		frame.add(webBrowser, BorderLayout.CENTER);
		Platform.runLater(new Runnable() {

			@Override
			public void run() {
				Group root = new Group();
				Scene scene = new Scene(root, WIDTH, HEIGHT);
				webBrowser.setScene(scene);
				Double widthDouble = new Integer(WIDTH).doubleValue();
				Double heightDouble = new Integer(HEIGHT).doubleValue();

				VBox box = new VBox(10);
				HBox urlBox = new HBox(10);
				final TextField urlTextField = new TextField();
				urlTextField.setText(url);
				Button go = new Button("go");
				urlTextField.setPrefWidth(WIDTH - 70);
				urlBox.getChildren().addAll(urlTextField, go);

				WebView view = new WebView();
				view.setMinSize(widthDouble, heightDouble);
				view.setPrefSize(widthDouble, heightDouble);
				final WebEngine eng = view.getEngine();
				eng.load(url);
				root.getChildren().add(view);

				box.getChildren().add(urlBox);
				box.getChildren().add(view);
				root.getChildren().add(box);

				go.setOnAction(new EventHandler<ActionEvent>() {
					@Override
					public void handle(ActionEvent event) {
						if (!urlTextField.getText().startsWith(urlStart)) {
							eng.load(urlStart + urlTextField.getText());
						} else {
							eng.load(urlTextField.getText());
						}
					}
				});
			}
		});

		int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
		int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(WIDTH, HEIGHT);
		frame.setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);
		frame.setVisible(true);
	}

}

这是一个很简单的例子。

我们创建了JFrame和JFXPanel,然后在Platform.runLater中进行Scene的创建,并设置到JFXPanel中。

我们创建了一个Textfield用来输入网址,创建了一个JavaFX Button来跳转到网址。判断网址是不是http://开头并做简单的处理。


下面看看运行效果:

如图所示。



另外,在Swt中使用的话是JFXCanvas,由于实现机制的问题,我们并不需要像在Swing中使用Platform类。而JFXCanvas也是org.eclipse.swt.widgets.Canvas的直接子类,我们可以直接使用。

示例如下:

    public class JFXInSwt {
        private static Scene createScene() {
            Group group = new Group();
            Scene scene = new Scene(group);
            Button button = new Button("JFX Button");
            group.getChildren().add(button);
            return scene;
        }
    
        public static void main(String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            FXCanvas canvas = new FXCanvas(shell, SWT.NONE);
            Scene scene = createScene();
            canvas.setScene(scene);
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) display.sleep();
            }
            display.dispose();
        }
    }


---------------------------------------------------------------------------------------

很不幸,由于Sourceforge的项目首页貌似被屏蔽了,就算我绑定了自己的一个一级域名...也是有时可以访问有时不能访问,所以示例不准备放在上面了。过一段时间买个空间自己建个站。


---------------------------------------------------------------------------------------

分享到:
评论

相关推荐

    miglayout:适用于Swing,SWT和JavaFX的官方MiG布局

    迁移适用于Swing,SWT和JavaFX的官方MiG布局对于手工编写GUI布局的Java开发人员来说,他们希望简单,强大和每个平台都能自动保真,而对于Swing,JavaFX和SWT中的当前布局管理器却不满意,MigLayout解决了您的布局...

    各ui框架下的Java浏览器(包含swt的浏览器,javafx的浏览器,swing的浏览器),支持Flash

    Java自制浏览器,支持Flash,各个版本的ui框架都有,具备所有IE内核具备的功能,拓展功能比如F5,比如前进后退,比如查看源代码,键盘...里面包含javafx的,swing的,swt三个版本的java浏览器,功能强大,供大家对比

    JavaFX 2.2 API英文参考文档CHM版2012

    JavaFX 2.2整合进java7 成为内置组件,准备取代swing/SWT作为java的主推GUI组件。值得关注吧。 新手册做成chm文件,便于离线时快速查询。 如果下载人多,就更新做更好的新版。

    Cross-Platform-Programming:Java(JavaFX,SWT,Swing),Scala小型研究项目

    HEAD Java(JavaFX,SWT,Swing),Scala小型研究项目 BSUIR任务,VMSIS团队,15个变体。 在这里,您可以找到我为学习跨平台编程而创建的研究项目。 用Java编写的lab001-lab004,lab005-lab008-Scala。 lab001: ...

    最新MigLayout jar及QuickStart

    包含:miglayout-3.7.4-ideutil.jar miglayout-3.7.4-javadoc.jar miglayout-3.7.4-sources.jar miglayout-3.7.4-swing.jar miglayout-3.7.4-swt.jar...MiGLayout - The Java Layout Manager for Swing, SWT and JavaFX

    Reflex:独立于GUI的java应用框架。可用于android、javafx、swing等等

    Java GUI 千千万万,并且不断发展,先后有Awt, Swing, Swt, Javafx, Android等等出现,以后可能还会有更多。。。 为了不重新发明轮子,我们需要以不变应万变,独立于GUI的应用框架-Reflex就诞生了。

    迷你JRE用于打包运行在没有java环境的计算机上

    可以运行swt swing 用于打包成exe中自带的jre运行环境。不错的东西

    miglayout-3.5.6.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.5.6/miglayout-3.5.6.jar

    e4-rendering:通用 e4 渲染引擎的概念证明,可以轻松插入特定的 UI 工具包

    e4-渲染 e4-rendering 是为 Eclipse 4 应用程序平台提供新的渲染引擎的概念证明。...使用预定义的运行配置启动 JavaFX、Swing 和 SWT 演示 执照 所有源代码文件均根据 Eclipse Public License - v 1.0 获得许可

    miglayout-3.7.3.1.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.7.3.1/miglayout-3.7.3.1.jar

    JWebdesktop-开源

    它使Java Web开发人员能够编写,打包和交付桌面应用程序,而无需学习任何桌面GUI API(Swing,SWT,JavaFX等)。 任何标准的Java Web应用程序都可以在几分钟之内打包和交付为桌面应用程序(通过JWebDesktop)。 ...

    miglayout-3.7.1.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.7.1/miglayout-3.7.1.jar

    miglayout-3.5.5.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.5.5/miglayout-3.5.5.jar

    miglayout-3.7.2.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.7.2/miglayout-3.7.2.jar

    miglayout-3.6.2.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.6.2/miglayout-3.6.2.jar

    miglayout-3.6.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.6/miglayout-3.6.jar

    miglayout-3.6.1.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.6.1/miglayout-3.6.1.jar

    miglayout-3.6.3.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.6.3/miglayout-3.6.3.jar

    miglayout-3.7.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.7/miglayout-3.7.jar

    miglayout-3.7.4.jar

    MiGLayout - 用于 Swing、SWT 和 JavaFX 的 Java 布局管理器 com.miglayout/miglayout/3.7.4/miglayout-3.7.4.jar

Global site tag (gtag.js) - Google Analytics