`
alexcheng
  • 浏览: 185454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaFX写的简易Rss阅读器

    博客分类:
  • Java
阅读更多

http://www.oreillynet.com/onjava/blog/2007/05/javafx_first_steps_hello_onjav_1.html这篇文章的启发,加上想学习一下JavaFX,就在上面那篇文章的基础上,做了一个简易的RSS阅读器,其界面类似于Adobe Flex 2的一个demo:进入http://try.flex.org/index.cfm,找到Blog Reader的demo。

读取RSS feed并没有什么问题,使用rome:

java 代码
  1. package rssreader;   
  2.   
  3. import com.sun.syndication.feed.synd.SyndEntry;   
  4. import com.sun.syndication.feed.synd.SyndFeed;   
  5. import com.sun.syndication.io.FeedException;   
  6. import com.sun.syndication.io.SyndFeedInput;   
  7. import com.sun.syndication.io.XmlReader;   
  8. import java.io.IOException;   
  9. import java.net.MalformedURLException;   
  10. import java.net.URL;   
  11.   
  12. public class RssReader {   
  13.     private URL url;   
  14.     private Integer titleLength = 50;   
  15.        
  16.     public RssReader() {   
  17.            
  18.     }   
  19.        
  20.     public SyndEntry[] load(String urlString) throws IllegalArgumentException, FeedException, IOException {   
  21.         if (urlString != null && urlString != "") {   
  22.             try {   
  23.                 url = new URL(urlString);   
  24.             } catch (MalformedURLException e) {   
  25.                 e.printStackTrace();   
  26.                 return null;   
  27.             }   
  28.         }   
  29.         if (url == null) {   
  30.             return null;   
  31.         }   
  32.         SyndFeedInput input = new SyndFeedInput();   
  33.         SyndFeed feed = input.build(new XmlReader(url));   
  34.         SyndEntry[] entries = (SyndEntry[]) feed.getEntries().toArray(new SyndEntry[0]);   
  35.   
  36.         for( SyndEntry entry : entries ) {   
  37.             entry.setTitle( entry.getTitle().length() > titleLength ? entry.getTitle().substring(0, titleLength - 3 ) + "..." : entry.getTitle() );   
  38.         }    
  39.            
  40.         return entries;   
  41.     }   
  42.        
  43.   
  44. }   

使用JavaFX构建UI:

JavaFX代码
  1. package rssreader;   
  2.   
  3. import javafx.ui.*;   
  4. import javafx.ui.canvas.*;   
  5. import javax.swing.JComponent;   
  6. import com.sun.syndication.feed.synd.SyndEntry;   
  7.   
  8. var reader:RssReader = READER;   
  9.   
  10. class RssReaderModel {   
  11.     attribute rssUrl: String;   
  12.     attribute rssEntries: SyndEntry*;   
  13.     attribute rssContent: String?;   
  14.     attribute rssSelectedIndex: Integer;   
  15. }   
  16.   
  17. var model = RssReaderModel {   
  18.     rssUrl: "http://woodstudio.iteye.com/blog/rss_blog/alexcheng",   
  19. };   
  20.   
  21.   
  22. var panel = GroupPanel {   
  23.      var row1 = Row {}   
  24.      var row2 = Row {}   
  25.      var col = Column {}   
  26.      rows: [row1, row2]   
  27.      columns: col   
  28.      content:    
  29.          [   
  30.             GroupPanel  {   
  31.                 row: row1   
  32.                 column: col   
  33.                 var row = Row {}   
  34.                 var labelCol =  new Column   
  35.                 var urlCol =  new Column   
  36.                 var butCol =  new Column   
  37.                 rows: row   
  38.                 columns: [labelCol, urlCol, butCol]   
  39.                 content:   
  40.                 [   
  41.                     SimpleLabel {   
  42.                         row: row   
  43.                         column: labelCol   
  44.                         text: "RSS URL:"  
  45.                     },   
  46.                      TextField {   
  47.                         row: row   
  48.                         column: urlCol   
  49.                         columns: 60   
  50.                         value: bind model.rssUrl   
  51.                     },   
  52.                     Button {   
  53.                         row: row   
  54.                         column: butCol   
  55.                         text: "Get Entries"  
  56.                         action: operation() {   
  57.                             model.rssEntries = reader.load(model.rssUrl);              
  58.                         }   
  59.                     }   
  60.                 ]   
  61.             },   
  62.             SplitPane   {   
  63.                 row: row2   
  64.                 column: col   
  65.                 orientation: HORIZONTAL   
  66.                 content:   
  67.                 [   
  68.                     SplitView  {   
  69.                         weight: 0.3   
  70.                         content:       
  71.                             Table {   
  72.                                     columns:   
  73.                                     [   
  74.                                         TableColumn {   
  75.                                             text: "Title"  
  76.                                         },   
  77.                                         TableColumn {   
  78.                                             text: "Date"  
  79.                                         },   
  80.                                     ]   
  81.                                     cells : bind foreach (entry in model.rssEntries)   
  82.                                             [   
  83.                                                 TableCell {   
  84.                                                     text: bind entry.title   
  85.                                                 },   
  86.                                                 TableCell {   
  87.                                                     text: bind entry.publishedDate.toLocaleString()   
  88.                                                 }   
  89.                                             ]   
  90.                                     selection: bind model.rssSelectedIndex   
  91.                                 }      
  92.                     },   
  93.                     SplitView  {   
  94.                         weight: 0.7   
  95.                         content:   
  96.                             EditorPane   {   
  97.                                 opaque: true  
  98.                                 contentType: HTML   
  99.                                 editable: false  
  100.                                 text: bind model.rssContent   
  101.                             }   
  102.                         }   
  103.                 ]   
  104.             }   
  105.          ]    
  106. };   
  107.   
  108. trigger on (RssReaderModel.rssSelectedIndex = value) {   
  109.     var desc = rssEntries[value].description.value;   
  110.     rssContent = "<html><body> {desc} </body></html>";    
  111. }   
  112.   
  113. MY_CONTAINER:JComponent.add(panel.getComponent());   
  114.   
  115.   

接着就是使用JSR223的scripting framework来执行:

java 代码
  1. package rssreader;   
  2.   
  3. import javax.script.Bindings;   
  4. import javax.script.ScriptContext;   
  5. import javax.script.ScriptEngine;   
  6. import javax.script.ScriptEngineManager;   
  7. import javax.script.SimpleScriptContext;   
  8. import javax.swing.JFrame;   
  9.   
  10. public class Main {   
  11.   
  12.     /**  
  13.      * @param args  
  14.      * @throws Exception  
  15.      */  
  16.     public static void main(String[] args) throws Exception {   
  17.         RssReader reader = new RssReader();   
  18.   
  19.         JFrame frame = new JFrame(   
  20.                 "RSS Reader implemented using JavaFX by alexcheng");   
  21.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  22.         frame.setSize(800600);   
  23.   
  24.         ClassLoader loader = Thread.currentThread().getContextClassLoader();   
  25.         ScriptEngineManager manager = new ScriptEngineManager(loader);   
  26.         ScriptEngine engine = manager.getEngineByExtension("fx");   
  27.   
  28.         Bindings bindings = engine.createBindings();   
  29.         bindings.put("READER:rssreader.RssReader", reader);   
  30.   
  31.         bindings.put("MY_CONTAINER:javax.swing.JComponent", frame   
  32.                 .getContentPane());   
  33.   
  34.         ScriptContext context = new SimpleScriptContext();   
  35.         context.setBindings(bindings, ScriptContext.GLOBAL_SCOPE);   
  36.         context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);   
  37.         engine.setContext(context);   
  38.   
  39.         String script = "import rssreader.FxMain;";   
  40.         engine.eval(script);   
  41.   
  42.         frame.setVisible(true);   
  43.     }   
  44.   
  45. }   

最后的界面如下:

 

  • 描述: JavaFX RSS Reader
  • 大小: 74.1 KB
分享到:
评论

相关推荐

    简易RSS阅读器

    【简易RSS阅读器】是一个基于Java编程语言开发的应用程序,主要功能是解析和展示RSS(Really Simple Syndication) feed,让使用者能够方便地获取和阅读网络上的新闻、博客或者其他更新内容。RSS是一种XML格式的数据...

    java源码资源Java+XML写的RSS阅读器

    在本例中,Java+XML写的RSS阅读器源码可能通过百度网盘作为分享途径,提供给其他开发者或用户下载和使用。由于涉及到网络分享链接,用户需要输入正确的分享码才能访问到相应的资源。分享码通常是唯一的,用于确保...

    基于Java开发的RSS阅读器模板设计源码

    利用Java的多种类库和框架,比如JavaFX或Swing用于UI设计,JDOM或DOM4J用于XML解析,Apache HttpClient用于网络通信等,可以实现一个功能完备的RSS阅读器。同时,借助于Java的反射机制、多线程和网络编程技术,还...

    智慧城市-2012年NEC智慧城市解决方案.zip

    智慧城市-2012年NEC智慧城市解决方案.zip

    IBMERP实施应收模块业务方案和用户操作手册手册超详.doc

    IBMERP实施应收模块业务方案和用户操作手册手册超详.doc

    spring-boot-1.4.4.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-2.4.0.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    JAVA保存计算过程的计算器课程设计报告样本.doc

    JAVA保存计算过程的计算器课程设计报告样本.doc

    scratch少儿编程逻辑思维游戏源码-像素任务.zip

    scratch少儿编程逻辑思维游戏源码-像素任务.zip

    spring-boot-1.4.6.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-2.6.9.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-1.5.14.RELEASE.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    rocksdbjni-6.22.1.1.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-死亡锯.zip

    scratch少儿编程逻辑思维游戏源码-死亡锯.zip

    FPGA单精度浮点数运算及PID控制的Verilog实现资料包

    内容概要:本文档介绍了一套完整的FPGA工程项目资料包,涵盖了单精度浮点数运算(加减乘除、开方)、浮点数与整数互转以及PID控制算法的Verilog实现。每个项目都包含了详细的工程代码、测试平台(testbench)和相关说明文件。此外,还提供了MATLAB文件用于验证PID算法的准确性,以及一个小工具用于浮点数和整数的转换。所有代码均为纯Verilog编写,不依赖于任何IP核,便于用户自定义修改和优化。 适合人群:对FPGA开发感兴趣的电子工程师、硬件开发者、科研人员及高校师生。 使用场景及目标:① 学习和掌握FPGA环境下单精度浮点数运算的基本原理及其具体实现方法;② 探索并理解PID控制算法在实际系统中的应用;③ 利用提供的MATLAB文件和小工具辅助教学或研究工作。 其他说明:资料包内的所有工程均可直接在Altera平台上进行仿真测试,帮助使用者快速入门并深入理解各个模块的功能特性。

    IBM企业内容管理解决方案.doc

    IBM企业内容管理解决方案.doc

    update9-20250501.5.208.slice.img.7z.003

    小雉系统分卷源码,修正系统安全问题

    rocksdbjni-6.25.3.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-boot-2.3.8.RELEASE.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    scratch少儿编程逻辑思维游戏源码-我的 scratch 旅行.zip

    scratch少儿编程逻辑思维游戏源码-我的 scratch 旅行.zip

Global site tag (gtag.js) - Google Analytics