[Java] RSS阅读器 →→→→→进入此内容的聊天室

来自 , 2020-05-07, 写在 Java, 查看 151 次.
URL http://www.code666.cn/view/7bccfde7
  1. package com.ruanko.view;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Component;
  5. import java.awt.Container;
  6. import java.awt.Dimension;
  7. import java.awt.FlowLayout;
  8. import java.awt.GridBagConstraints;
  9. import java.awt.GridLayout;
  10. import java.awt.Toolkit;
  11. import java.awt.event.ActionEvent;
  12. import java.awt.event.ActionListener;
  13. import java.awt.event.KeyEvent;
  14. import java.awt.event.MouseAdapter;
  15. import java.awt.event.MouseEvent;
  16. import java.awt.event.MouseListener;
  17.  
  18. import java.io.BufferedWriter;
  19. import java.io.File;
  20. import java.io.FileWriter;
  21. import java.io.IOException;
  22.  
  23. import java.text.SimpleDateFormat;
  24. import java.util.Date;
  25. import java.util.List;
  26.  
  27. import javax.swing.ImageIcon;
  28. import javax.swing.JDialog;
  29. import javax.swing.JFrame;
  30. import javax.swing.JLabel;
  31. import javax.swing.JOptionPane;
  32. import javax.swing.JPanel;
  33. import javax.swing.JComboBox;
  34. import javax.swing.JButton;
  35. import javax.swing.JScrollPane;
  36. import javax.swing.JSplitPane;
  37. import javax.swing.JTable;
  38. import javax.swing.JTextArea;
  39. import javax.swing.JTree;
  40. import javax.swing.KeyStroke;
  41. import javax.swing.event.AncestorEvent;
  42. import javax.swing.event.AncestorListener;
  43. import javax.swing.event.TreeSelectionEvent;
  44. import javax.swing.event.TreeSelectionListener;
  45. import javax.swing.table.DefaultTableModel;
  46. import javax.swing.tree.DefaultMutableTreeNode;
  47.  
  48. import com.ruanko.model.Channel;
  49. import com.ruanko.model.News;
  50. import com.ruanko.service.RSSService;
  51. import com.ruanko.service.UpdateThread;
  52. import com.runko.dao.NewsDao;
  53.  
  54. import javax.swing.JMenuBar;
  55. import javax.swing.JMenu;
  56. import javax.swing.JMenuItem;
  57. import javax.swing.JToolBar;
  58.  
  59. import java.awt.Color;
  60.  
  61. @SuppressWarnings({ "serial", "unused" })
  62. public class JMainFrame extends JFrame
  63. {
  64.         /**
  65.          * Description: 主界面窗体
  66.          * @param WIDTH 静态全局变量,设置窗体的宽度
  67.          * @param HEIGHT 全局静态变量,设置窗体的高度
  68.          * @param TITLE  全局静态变量,设置窗体标题
  69.          */
  70.         RSSService rssService = null;
  71.         private NewsDao rssDao;
  72.        
  73.         private final static int WIDTH = 800;
  74.         private final static int HEIGHT = 650;
  75.         private final static String TITLE = "RSS阅读器";
  76.        
  77.         private JButton jbExport;                                               //导出按钮
  78.         private JButton jbUpdate;                                               //更新按钮
  79.         private JButton jbExit;                                                 //退出按钮
  80.         private JTextArea jtaContent;                                   //新闻内容文本区
  81.         private DefaultTableModel dtmTableModel;                //表格数据模型
  82.         private JTable jtTable;                                                 //表格
  83.         private List<News> newsList;                                    //新闻内容列表
  84.         private static List<Channel> channelList;
  85.        
  86.         private ShowJdialog showJdialogMessage = new ShowJdialog();                                             //提示窗口
  87.         private JLabel label;
  88.        
  89.         private ReadActionListener readactionlistener;
  90.        
  91.         private int select = 0;                                 //保存选中的新闻选项
  92.        
  93.         public JMainFrame()
  94.         {
  95.                 rssService = new RSSService();
  96.                
  97.                 this.setTitle(TITLE);
  98.                 this.setSize(WIDTH,HEIGHT);
  99.                 this.setCenter();
  100.                 this.setJMenuBar(getJMBMy());
  101.                 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  102.                 this.setContentPane(getJPMain());
  103.                
  104.                 readactionlistener = new ReadActionListener();
  105.         }
  106.        
  107.         private void setCenter()                //窗口居中显示
  108.         {
  109.                 Toolkit kit = Toolkit.getDefaultToolkit();
  110.                 Dimension screenSize = kit.getScreenSize();
  111.                 this.setLocation((screenSize.width - WIDTH)/2,(screenSize.height - HEIGHT)/2);
  112.         }
  113.        
  114.         private JMenuBar getJMBMy()                     //菜单栏
  115.         {
  116.                 channelList = rssService.getChannelList();
  117.                
  118.                 JMenuBar menuBar = new JMenuBar();
  119.                
  120.                 JMenu menu = new JMenu("文件(F)");
  121.                 menu.setMnemonic(KeyEvent.VK_F);
  122.                
  123.                 JMenu help = new JMenu("帮助(H)");
  124.                 help.setMnemonic(KeyEvent.VK_H);
  125.                
  126.                 JMenu view = new JMenu("新闻列表(O)");
  127.                 view.setMnemonic(KeyEvent.VK_O);
  128.                
  129.                 /**
  130.                  * 添加新闻列表
  131.                  */
  132.                
  133.                 JMenuItem[] view_item = new JMenuItem[channelList.size()];
  134.                
  135.                 for(int i = 0; i < channelList.size(); i++)
  136.                 {
  137.                         Channel channel = channelList.get(i);
  138.                         view_item[i] = new JMenuItem(channel.getName());
  139.                         view.add(view_item[i]);
  140.                         view_item[i].addActionListener(new ActionListener()
  141.                         {
  142.                                 public void actionPerformed(ActionEvent e)
  143.                                 {
  144.                                         readactionlistener.actionPerformed(e);
  145.                                 }
  146.                         });
  147.                 }
  148.                
  149.                 JMenuItem item_dao = new JMenuItem("导出(D)",KeyEvent.VK_D);
  150.                 item_dao.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,ActionEvent.CTRL_MASK));
  151.                 item_dao.addActionListener(new ActionListener()
  152.                 {      
  153.                         public void actionPerformed(ActionEvent e)
  154.                         {
  155.                                 ExportActionListener export = new ExportActionListener();
  156.                                 export.actionPerformed(e);
  157.                         }
  158.                 });
  159.                
  160.                 JMenuItem item_ESC = new JMenuItem("退出(X)",KeyEvent.VK_X);
  161.                 item_ESC.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK));
  162.                 item_ESC.addActionListener(new ActionListener()
  163.                 {
  164.                         public void actionPerformed(ActionEvent e)
  165.                         {
  166.                                 System.exit(0);
  167.                         }
  168.                 });
  169.                
  170.                 menuBar.add(menu);
  171.                 menuBar.add(help);
  172.                
  173.                 menu.add(view);
  174.                 menu.add(item_dao);
  175.                 menu.add(item_ESC);
  176.                
  177.                 return menuBar;
  178.         }
  179.        
  180.         class ReadActionListener implements ActionListener
  181.         {
  182.                 /**
  183.                  * 新闻内容读取功能
  184.                  *
  185.                  */
  186.                 public void actionPerformed(ActionEvent e)
  187.                 {
  188.                         showNews(e.getActionCommand());
  189.                 }
  190.         }
  191.        
  192.         private void showNews(String name)                             
  193.         {
  194.                 /**
  195.                  * 把新闻显示功能独立成一个方法
  196.                  */
  197.                
  198.                 Channel selectedChannel = new Channel();
  199.                 for(int i = 0; i < channelList.size(); i++)
  200.                 {
  201.                         selectedChannel = channelList.get(i);
  202.                         if(selectedChannel.getName() == name)
  203.                         {
  204.                                 select = i;
  205.                                 break;
  206.                         }
  207.                 }
  208.                 String filePath = selectedChannel.getFilePath();
  209.                 newsList = rssService.getNewsList(filePath);
  210.                 jtaContent.setText("");
  211.                 showTable(newsList);
  212.         }
  213.        
  214.         class ExportActionListener implements ActionListener
  215.         {
  216.                 /**
  217.                  * 导出按钮的动作事件
  218.                  */
  219.                 public void actionPerformed(ActionEvent e)
  220.                 {
  221.                         if(newsList == null)
  222.                         {
  223.                                 Channel channel = channelList.get(select);
  224.                                 String filePath = channel.getFilePath();
  225.                                 newsList = rssService.getNewsList(filePath);
  226.                         }
  227.                         if(rssService.save())
  228.                                 showJdialogMessage.showJdialog("新闻信息保存成功!");
  229.                         else
  230.                                 showJdialogMessage.showJdialog("新闻信息保存失败!");
  231.                 }
  232.         }
  233.        
  234.         private JPanel getJPMain()                              //窗口面板
  235.         {
  236.                 JPanel jpMain = new JPanel();           //主面板
  237.                 jpMain.setLayout(new BorderLayout());
  238.                 jpMain.add(getJTBMy(), BorderLayout.NORTH);
  239.                
  240.                 jpMain.add(getJSPLeft() ,BorderLayout.CENTER);
  241.                 jpMain.add(getJSBMy(),BorderLayout.SOUTH);
  242.                 return jpMain;
  243.         }
  244.        
  245.         private JSplitPane getJSPLeft()                                 //左右面板分割
  246.         {
  247.                 JSplitPane jsLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
  248.                
  249.                 jsLeft.setDividerLocation(180);
  250.                
  251.                 jsLeft.setLeftComponent(getJTree());
  252.                
  253.                 jsLeft.setRightComponent(getJSPClientArea());
  254.                
  255.                 return jsLeft;
  256.         }
  257.        
  258.         private JScrollPane getJTree()                          //获取树形控件
  259.         {
  260.                 String[] name = new String[10];
  261.                 for(int i = 0; i < channelList.size(); i++)
  262.                 {
  263.                         Channel channel = channelList.get(i);
  264.                         name[i] = channel.getName();
  265.                 }
  266.                
  267.                 DefaultMutableTreeNode root = new DefaultMutableTreeNode("新闻列表");
  268.                 DefaultMutableTreeNode t1 = new DefaultMutableTreeNode("腾讯新闻");
  269.                 DefaultMutableTreeNode t2 = new DefaultMutableTreeNode("新浪新闻");
  270.                
  271.                 DefaultMutableTreeNode t1_1 = new DefaultMutableTreeNode(name[0]);
  272.                 DefaultMutableTreeNode t1_2 = new DefaultMutableTreeNode(name[1]);
  273.                 DefaultMutableTreeNode t2_1 = new DefaultMutableTreeNode(name[2]);
  274.                 DefaultMutableTreeNode t2_2 = new DefaultMutableTreeNode(name[3]);
  275.                
  276.                 root.add(t1);
  277.                 root.add(t2);
  278.                
  279.                 t1.add(t1_1);
  280.                 t1.add(t1_2);
  281.                 t2.add(t2_1);
  282.                 t2.add(t2_2);
  283.                
  284.                 final JTree jtree = new JTree(root);
  285.                
  286.                 jtree.addTreeSelectionListener(new TreeSelectionListener()
  287.                 {
  288.                         public void valueChanged(TreeSelectionEvent e)
  289.                         {
  290.                                 DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)jtree.getLastSelectedPathComponent();
  291.                                 if(selectedNode == null)
  292.                                         return ;
  293.                                 if(selectedNode.isLeaf())
  294.                                 {
  295.                                         showNews(selectedNode.toString());
  296.                                 }
  297.                         }
  298.                 });
  299.                
  300.                 JScrollPane jtTreePanel = new JScrollPane(jtree);// 将树放在滚动面板中
  301.                 return jtTreePanel;
  302.         }
  303.        
  304.         public JToolBar getJTBMy()                      //工具栏
  305.         {
  306.                 JToolBar jtTool = new JToolBar();
  307.                 jtTool.setLayout(new FlowLayout(FlowLayout.LEFT));
  308.                 jtTool.add(getJBExport());
  309.                 jtTool.add(getJBUpdate());
  310.                 jtTool.add(getJBExit());
  311.                 return jtTool;
  312.         }
  313.        
  314.         private JSplitPane getJSPClientArea()                                   //分割面板
  315.         {
  316.                 JSplitPane jspVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  317.                
  318.                 jspVertical.setDividerLocation(240);
  319.                
  320.                 jspVertical.setLeftComponent(getJSPTable());
  321.                
  322.                 jspVertical.setRightComponent(getJSPContent());
  323.                
  324.                 return jspVertical;
  325.         }
  326.        
  327.         private JPanel getJSBMy()                                               //状态栏
  328.         {
  329.                 JPanel status = new JPanel();
  330.                 status.setLayout(new FlowLayout(FlowLayout.LEFT));
  331.                
  332.                 JLabel jlStatus = new JLabel("www.ruanko.com");
  333.                 status.add(jlStatus);
  334.                
  335.                 return status;
  336.         }
  337.        
  338.         private JScrollPane getJSPContent()                             //新闻文本区
  339.         {
  340.                 JScrollPane jspContent = null;
  341.                 if(jtaContent == null)
  342.                 {
  343.                         jtaContent = new JTextArea();
  344.                         jtaContent.setLineWrap(true);                   //文本区的换行策略
  345.                         jspContent = new JScrollPane(jtaContent);
  346.                         jspContent.setPreferredSize(new Dimension(780, 260));
  347.                 }
  348.                 return jspContent;
  349.         }
  350.        
  351.         private void showTable(List<News> newsList)                             //新闻内容以表格显示
  352.         {
  353.                 //清空表格的内容
  354.                 int rowCount = dtmTableModel.getRowCount();
  355.                 while(rowCount > 0)
  356.                 {
  357.                         dtmTableModel.removeRow(0);
  358.                         rowCount--;
  359.                 }
  360.                
  361.                 //遍历新闻内容列表,将相应的新闻内容显示到表格中
  362.                 for(int i = 0; i < newsList.size(); i++ )
  363.                 {
  364.                         News news = newsList.get(i);
  365.                        
  366.                         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd- HH:mm:ss");
  367.                         Date date = new Date();
  368.                         String currentDate = dateFormat.format(date);
  369.                        
  370.                         String[] data = {news.getTitle(),currentDate,news.getPubDate(),news.getAuthor()};
  371.                         dtmTableModel.addRow(data);
  372.                 }
  373.         }
  374.        
  375.         private JScrollPane getJSPTable()                               //表格内容单击事件处理
  376.         {
  377.                 JScrollPane jspTable = null;
  378.                 if(jtTable == null)
  379.                 {
  380.                         dtmTableModel = new DefaultTableModel();
  381.                         dtmTableModel.addColumn("主题");
  382.                         dtmTableModel.addColumn("接收时间");
  383.                         dtmTableModel.addColumn("发布时间");
  384.                         dtmTableModel.addColumn("作者");
  385.                        
  386.                         jtTable = new JTable(dtmTableModel);
  387.                        
  388.                         jtTable.addMouseListener(new MouseAdapter()
  389.                         {
  390.                                 /**
  391.                                  * 重写mouseClicked() 方法处理鼠标点击事件
  392.                                  */
  393.                                 public void mouseClicked(MouseEvent e)
  394.                                 {
  395.                                         if(e.getButton() == MouseEvent.BUTTON1)
  396.                                         {
  397.                                                 int selectedRow = jtTable.getSelectedRow();
  398.                                                 News selectedNews = newsList.get(selectedRow);
  399.                                                 jtaContent.setText(rssService.newsToString(selectedNews));
  400.                                         }
  401.                                 }
  402.                         });
  403.                         jspTable = new JScrollPane(jtTable);
  404.                 }
  405.                 return jspTable;
  406.         }
  407.        
  408.         private JButton getJBExport()   //导出按钮
  409.         {
  410.                 if(jbExport == null)
  411.                 {
  412.                         ImageIcon icon = new ImageIcon("images/export.png");
  413.                         jbExport = new JButton(icon);
  414.                         jbExport.setToolTipText("导出");
  415.                         jbExport.addActionListener(new ActionListener()
  416.                         {
  417.                                 public void actionPerformed(ActionEvent e)
  418.                                 {
  419.                                         ExportActionListener export = new ExportActionListener();
  420.                                         export.actionPerformed(e);
  421.                                 }
  422.                         });
  423.                 }
  424.                 return jbExport;
  425.         }
  426.        
  427.        
  428.         private JButton getJBUpdate()                           //更新按钮
  429.         {
  430.                 if(jbUpdate == null)
  431.                 {
  432.                         ImageIcon icon = new ImageIcon("images/update.png");
  433.                         jbUpdate = new JButton(icon);
  434.                         jbUpdate.setToolTipText("更新新闻内容");
  435.                         jbUpdate.addActionListener(new ActionListener()
  436.                         {
  437.                                 public void actionPerformed(ActionEvent e)
  438.                                 {
  439.                                         UpdateThread up = new UpdateThread();
  440.                                         up.start();
  441.                                 }
  442.                         });
  443.                 }
  444.                 return jbUpdate;
  445.         }
  446.        
  447.         private JButton getJBExit()                                             //退出按钮
  448.         {
  449.                 if(jbExit == null)
  450.                 {
  451.                         ImageIcon icon = new ImageIcon("images/exit.png");
  452.                         jbExit = new JButton(icon);
  453.                         jbExit.setToolTipText("退出RSS阅读器");
  454.                         jbExit.addActionListener(new ActionListener()
  455.                         {
  456.                                 public void actionPerformed(ActionEvent e)
  457.                                 {
  458.                                         System.exit(0);
  459.                                 }
  460.                         });
  461.                 }
  462.                 return jbExit;
  463.         }
  464. }
  465.  

回复 "RSS阅读器"

这儿你可以回复上面这条便签

captcha