`
somefuture
  • 浏览: 1090943 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(翻译)第七回 JavaFX2.0和Swing的集成

阅读更多

原文地址http://download.oracle.com/javafx/2.0/swing/jfxpub-swing.htm

 

JavaFX 2.0 发布版引入了JFXPanel类,它位于 javafx.embed.swing 包中,使你能够将JavaFX内容绑定进Swing 程序。

本文教你怎么将JavaFX内容加进Swing 程序中并指导你如何在一个同时具备Swing 和JavaFX 的应用中正确使用线程。

 

添加JavaFX到Swing组件

 要达到本文的目的,你要创建一个JFrame 组件,并添加一个JFXPanel 对象,JFXPanel组件的图形场景要包含JavaFX 内容。

和所有的Swing程序一样,你要在 Event Dispatch Thread (事件调度线程EDT)上创建图形用户接口(GUI) 。Example 1 展示了initAndShowGUI 方法,它创建了一个JFrame 组件并添加了JFXPanel 对象。创建JFXPanel 类的实例会在后台开始JavaFX 运行时。GUI 创建后,调用initFX 方法在JavaFX线程上创建JavaFX场景。

 

Example 1

public class Test {

    private static void initAndShowGUI() {
        // This method is invoked on the EDT thread
        JFrame frame = new JFrame("FX");
        final JFXPanel fxPanel = new JFXPanel();
        frame.add(fxPanel);
        frame.setVisible(true);

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
            initFX(fxPanel);
            }
       });
    }

    private static void initFX(JFXPanel fxPanel) {
        // This method is invoked on the JavaFX thread
        Scene scene = createScene();
        fxPanel.setScene(scene);
    }

    private static Scene createScene() {
        //Code to create the JavaFX scene
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
            initAndShowGUI();
            }
        });
    }
}

 

 

JavaFX-Swing的互操作性和线程

由于JavaFX和Swing的数据存在与一个程序中,你可能遇到以下互操作的情况:

  • 一个JavaFX的数据改变是由Swing的数据改变引起的.

  • 反之.

改变JavaFX的数据来回应Swing数据的改变

记住JavaFX的数据只能通过javaFX用户线程访问。不论何时要改变JavaFX 数据都要把你的代码用一个Runnable 对象包围起来并调用Platform.runLater 方法。见Example 2 .

Example 2

jbutton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        Platform.runLater(new Runnable() { 
            @Override
            public void run() {
                fxlabel.setText("Swing button clicked!"); 
            }
        });
    }
});

改变Swing数据来回应JavaFX 数据的改变

记住Swing数据的改变要通过EDT。确保你的代码实现了EDT,把它用Runnable 对象环绕并调用SwingUtilities.invokeLater 方法。见Example 3 .

Example 3

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        //Code to change Swing data.
    }
});

SwingBrowser2: 一个集成了JavaFX组件的Swing应用

通过SwingBrowser2 可以看到 Swing - JavaFX是怎么互操作的,它为浏览器提供了常用的基本功能。你可以在它的地址栏中键入一个URL 来查看应用窗口加载的页面。你可以通过点页面链接去到新页面、返回前一页、打开标签页、加入书签、全页面检索。 Figure 1是该应用的窗口。

Figure 1 The SwingBrowser2 application window

Description of Figure 1 follows
Description of "Figure 1 The SwingBrowser2 application window"

初始化Swing数据

你可以从一个NB工程中的侧边栏点链接来下载swingbrowser2.zip 文件。解压到本地并从Netbeans IDE中运行为工程。确保你的NetBeans IDE版本是支持的。

 SwingBrowser2打开后,它的GUI创建就在 EDT上。通过边栏的链接查看 Main.java 文件。

应用的顶层窗口是一个 JFrame 组件,包含了很多Swing 组件,比如一个tabbed面板,一个menu,几个text field、button,还有一个要显示JavaFX内容的JFX 面板。

加载 JavaFX内容

刚开始运行,JFX面板包含一个空的WebView 对象。当在地址栏输入一个URL后, AddressBar.java中的 action listener 就开始加载页面。代码见Example 4 .

Example 4

txtURL.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) {
        browser.load(txtURL.getText());
    }
});

Browser.java文件中的load 方法验证URL并调用call方法,见 Example 5 .

Example 5

public void load(String str) {
    if (str != null {
        str = str.trim();

        if (str.isEmpty()) return;

        String url = toURL(str);
        if (url == null) {
            url = toURL("http://" + str);
        }
        if (url != null) {
        Platform.runLater (new Runnable() {
            @Override
            public void run () {
     
        call(url);
        }
    }
}

private static String toURL(String str) {
    try {
        return new URL(str).toExternalForm();
    } catch (MalformedURLException exception) {
        return null;
    }
}

JavaFX数据应该只能在JavaFX线程上访问。call方法验证了线程并确保特点URL的页面被加载在 JavaFX线程上。Callback.java 文件中有完整代码。Example 6 是表明了实现方案的代码块。

Example 6

public final void call(final String value) {
    if (Platform.isFXApplicationThread()) {
        callImpl(value);
    }
    else {
        Platform.runLater(new Runnable() {
            @Override public void run() {
                callImpl(value);
            }
        });
    }
}

protected void callImpl(String value) {
    getEngine().load(value);
}

更新Swing数据

WebView 组件加载了新页面后,页面标题就从JavaFX数据中取回并传递给Swing GUI。然后页面标题就显示在标签页上并加入应用标题。 TabbedBrowser.java 中有完整代码。Example 7 是表明了实现方案的代码块。

Example 7

public WebPane addNewTab(final String url, boolean selected) {
    ...
    final WebPane wp = new WebPane(url);

    wp.getBrowser().getEngine().titleProperty().addListener(
new javafx.beans.value.ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, 
String oldValue, final String title) {
            EventQueue.invokeLater(new Runnable() {
                @Override public void run() {
                    setTitleAt(indexOfComponent(wp), title);
                    setToolTipTextAt(indexOfComponent(wp), title);

                    if (getSelectedComponent() == wp) {
                    setWindowTitle(title);
                    }
                }
            )};
        }
    )};
}

想了解怎么部署二者的整合应用,到 Deploying JavaFX Applications 查看。

0
0
分享到:
评论
4 楼 somefuture 2011-11-27  
nizhenyuan 写道
somefuture 写道
nizhenyuan 写道
请问一下怎样将javaFX2.0在web页面上显示?多谢~如果可以,发到我的邮箱也可以894108065@qq.com

你好,如果使用NB的话(也推荐使用这个),项目生成后会自动出现jar,html和jnlp。其中html就是在页面显示的。
Open Project Properties to specify preferred dimensions for your application scene. Enter 800 for width and 600 for height if you use the Colorful Circles example. Then build the project with Clean and Build. Your application package is generated to the dist folder. Open it in Windows Explorer and try double-clicking on the HTML, JNLP, or JAR 。docs.oracle.com/javafx/2.0/deployment/deploy_quick_start.htm#BABJCFHC

你好!我用的是NB7.1  但我的Colorful Circles application没有生成您所说的jar,html和jnlp啊,javaF2.0会自动生成这3个文件吗?您是在哪找到这三个文件的啊?

你好,请按照本文一试。http://somefuture.iteye.com/blog/1276827
3 楼 nizhenyuan 2011-11-25  
somefuture 写道
nizhenyuan 写道
请问一下怎样将javaFX2.0在web页面上显示?多谢~如果可以,发到我的邮箱也可以894108065@qq.com

你好,如果使用NB的话(也推荐使用这个),项目生成后会自动出现jar,html和jnlp。其中html就是在页面显示的。
Open Project Properties to specify preferred dimensions for your application scene. Enter 800 for width and 600 for height if you use the Colorful Circles example. Then build the project with Clean and Build. Your application package is generated to the dist folder. Open it in Windows Explorer and try double-clicking on the HTML, JNLP, or JAR 。docs.oracle.com/javafx/2.0/deployment/deploy_quick_start.htm#BABJCFHC

你好!我用的是NB7.1  但我的Colorful Circles application没有生成您所说的jar,html和jnlp啊,javaF2.0会自动生成这3个文件吗?您是在哪找到这三个文件的啊?
2 楼 somefuture 2011-11-24  
nizhenyuan 写道
请问一下怎样将javaFX2.0在web页面上显示?多谢~如果可以,发到我的邮箱也可以894108065@qq.com

你好,如果使用NB的话(也推荐使用这个),项目生成后会自动出现jar,html和jnlp。其中html就是在页面显示的。
Open Project Properties to specify preferred dimensions for your application scene. Enter 800 for width and 600 for height if you use the Colorful Circles example. Then build the project with Clean and Build. Your application package is generated to the dist folder. Open it in Windows Explorer and try double-clicking on the HTML, JNLP, or JAR 。docs.oracle.com/javafx/2.0/deployment/deploy_quick_start.htm#BABJCFHC
1 楼 nizhenyuan 2011-11-24  
请问一下怎样将javaFX2.0在web页面上显示?多谢~如果可以,发到我的邮箱也可以894108065@qq.com

相关推荐

    通讯录的设计与实现-java-version2.0

    可以使用JavaFX的皮肤和组件库,或者引入第三方UI库,如JFoenix(JavaFX的Material Design风格)来提升视觉效果。 8. **安全与隐私**:通讯录包含敏感的个人信息,因此在设计时应考虑数据的安全性。可以采用加密...

    jdk-6u43-windows-i586

    9. **JavaFX Script**:虽然JavaFX 2.0以后与Java 7捆绑,但Java 6中的JavaFX Script提供了一种用于创建富客户端应用的新语言。 总的来说,“jdk-6u43-windows-i586”是Java 6时代的一个稳定更新,它在32位Windows...

    JAVA实现微信桌面端-可登录使用

    开发者需要实现扫码识别逻辑,这可能涉及到图像处理和第三方扫码库的集成。 6. **多线程**:为了保证程序的响应性和非阻塞操作,开发者需要利用Java的并发特性,如线程池、Future、Callable等,来处理后台任务和...

    WeatherApp2.0

    它可能集成了第三方API来获取全球各地的气象数据,并通过友好的用户界面展示这些信息。 从项目文件名"WeatherApp2.0-master"来看,这是一个Git仓库的主分支,遵循开源项目的常规命名规范,其中"master"代表默认分支...

    RSS阅读器开发实战

    4. **Java Swing或JavaFX**:如果RSS阅读器是桌面应用,那么可能会用到Java GUI库,如Swing或JavaFX来构建用户界面。开发者需要了解组件布局、事件处理、数据绑定等概念。 5. **HTTP请求**:为了获取RSS feed,应用...

    jdk-6u20-windows-x64.exe

    2. **增强的Swing组件**:Swing UI库得到了重大升级,提供了更好的外观和感觉,支持丰富的图形用户界面,并且与JavaFX更好地集成。 3. **XML处理增强**:JDK 1.6对Java API for XML Processing (JAXP)进行了改进,...

    sina-weibo.rar_新浪微博

    3. **用户界面设计**:虽然项目在美化方面有所欠缺,但理解UI/UX设计原则和使用JavaFX或Swing等库创建用户界面是改进项目的重要方向。 4. **文件组织结构**:Java项目通常遵循一定的文件结构,如src目录存放源代码...

    java版微博并带有完美客户端

    - **OAuth 2.0**:可能使用OAuth 2.0进行授权,允许第三方应用安全地访问用户在微博上的信息。 6. **缓存机制** - **Redis**:为了提高性能和减少数据库压力,可能会使用Redis作为缓存服务,存储热门微博或用户...

    坦克大战图片版源码

    1. **Java GUI编程**:可能使用了Java的Swing或JavaFX库来创建游戏界面,包括坦克、地图、得分等元素的展示。 2. **多线程**:游戏通常需要处理玩家输入、游戏逻辑更新、画面刷新等多个任务,这些任务可能会在不同...

    SpotifyStreamer:学习测试

    这可能使用JavaFX或Swing库,或者更现代的Java Web Start或JavaFX与FXML的结合。 7. **错误处理和日志记录**:学习如何优雅地处理API错误,如网络故障、权限问题等,以及使用日志框架(如Log4j)记录程序运行信息。...

    CloverBrowser:一个简单的网络浏览器

    7. **许可文件**:说明软件的许可协议,可能为MIT、Apache 2.0或其他开源许可。 CloverBrowser的实现可能涉及到以下关键技术点: - **URL处理**:使用java.net.URL和HttpURLConnection类来解析和连接到互联网上的...

    LyricArt:输入歌曲名称,然后输入歌手姓名,程序会自动保存专辑封面和歌词! 仍在开发中。

    8. **持续集成/持续部署(CI/CD)**:随着项目的开发,持续集成和持续部署流程可以帮助确保代码质量并快速发布新版本。可以使用Jenkins、Travis CI或GitHub Actions等工具来自动化构建、测试和部署过程。 9. **测试...

    Rating Test-开源

    Java提供了多种库来创建GUI,例如Swing或JavaFX。开发者需要理解事件处理、布局管理器以及如何设计用户友好的界面。 3. **音频处理**:听力测试涉及音频播放和分析。开发者可能使用Java Sound API或其他第三方库如...

    gps-tracking:GPS监控系统

    JavaFX或Swing可以用来创建桌面应用的UI,而如果是Web应用,可以选择Spring Boot结合Thymeleaf、Freemarker或JSP进行视图渲染。 8. **安全性** 系统需要保护数据安全,防止未经授权的访问。Java提供SSL/TLS加密...

    SpotifyStreamer:SpotifyStreamingApp

    3. **用户界面(UI)设计**:SpotifyStreamer可能采用了JavaFX或Swing库来构建用户界面。这些库提供了丰富的组件,如按钮、文本框、播放器控件等,用于构建直观且易于使用的界面。 4. **音乐播放控制**:应用需要...

    frinika-fork2

    3. **Java类库**:Java Standard Edition (Java SE) 提供了大量的内置类库,如Swing和JavaFX用于图形用户界面(GUI)开发,可能在Frinika的用户界面中有所应用。 4. **MIDI和音频处理**:由于项目可能涉及音乐制作...

    spotify_streamer:音乐流媒体应用

    在 Java 中,可以使用 JavaFX 或 Swing 创建图形用户界面(GUI)。 ### 7. 数据缓存与状态管理 考虑到用户体验,`spotify_streamer` 可能采用了某种形式的数据缓存,以减少不必要的网络请求。此外,状态管理也是...

    SEM-Group19

    10. **持续集成/持续部署(CI/CD)**:为了保证代码的质量和自动化测试,团队可能使用了Jenkins、Travis CI等工具实现持续集成和持续部署。 综上所述,SEM-Group19项目是一个结合了Java编程、图像处理、数据解析...

    EMS-Client:客户端项目的存储库

    - 如果是桌面应用,UI组件可能包括JavaFX或Swing等;如果是Web应用,可能是HTML、CSS和JavaScript的组合,或者使用React、Vue.js或Angular等前端框架。 - UI相关文件通常位于`src/main/resources`目录下,包括图片...

    Reddit-IT:我为响应 rtalesfromtechsupport 上的 reddit 线程而制作的一个简单的笑话应用程序

    5. **用户界面设计**:使用JavaFX或Swing等库创建用户界面,使用户能够浏览和互动。 6. **数据存储与缓存**:可能涉及本地数据存储,如SQLite数据库,以缓存帖子避免频繁请求。 7. **版本控制**:通过Git进行版本...

Global site tag (gtag.js) - Google Analytics