`
alexcheng
  • 浏览: 178105 次
  • 性别: 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics