用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

RSS阅读器

2015-07-16 作者: YunmR举报

[java]代码库

package com.ruanko.view;
 
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
 
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
 
import com.ruanko.model.Channel;
import com.ruanko.model.News;
import com.ruanko.service.RSSService;
import com.ruanko.service.UpdateThread;
import com.runko.dao.NewsDao;
 
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;
 
import java.awt.Color;
 
@SuppressWarnings({ "serial", "unused" })
public class JMainFrame extends JFrame
{
    /**
     * Description: 主界面窗体
     * @param WIDTH 静态全局变量,设置窗体的宽度
     * @param HEIGHT 全局静态变量,设置窗体的高度
     * @param TITLE  全局静态变量,设置窗体标题
     */
    RSSService rssService = null;
    private NewsDao rssDao;
     
    private final static int WIDTH = 800;
    private final static int HEIGHT = 650;
    private final static String TITLE = "RSS阅读器";
     
    private JButton jbExport;                       //导出按钮
    private JButton jbUpdate;                       //更新按钮
    private JButton jbExit;                         //退出按钮
    private JTextArea jtaContent;                   //新闻内容文本区
    private DefaultTableModel dtmTableModel;        //表格数据模型
    private JTable jtTable;                         //表格
    private List<News> newsList;                      //新闻内容列表
    private static List<Channel> channelList;
     
    private ShowJdialog showJdialogMessage = new ShowJdialog();                     //提示窗口
    private JLabel label;
     
    private ReadActionListener readactionlistener;
     
    private int select = 0;                 //保存选中的新闻选项
     
    public JMainFrame()
    {
        rssService = new RSSService();
         
        this.setTitle(TITLE);
        this.setSize(WIDTH,HEIGHT);
        this.setCenter();
        this.setJMenuBar(getJMBMy());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(getJPMain());
         
        readactionlistener = new ReadActionListener();
    }
     
    private void setCenter()        //窗口居中显示
    {
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        this.setLocation((screenSize.width - WIDTH)/2,(screenSize.height - HEIGHT)/2);
    }
     
    private JMenuBar getJMBMy()         //菜单栏
    {
        channelList = rssService.getChannelList();
         
        JMenuBar menuBar = new JMenuBar();
         
        JMenu menu = new JMenu("文件(F)");
        menu.setMnemonic(KeyEvent.VK_F);
         
        JMenu help = new JMenu("帮助(H)");
        help.setMnemonic(KeyEvent.VK_H);
         
        JMenu view = new JMenu("新闻列表(O)");
        view.setMnemonic(KeyEvent.VK_O);
         
        /**
         * 添加新闻列表
         */
         
        JMenuItem[] view_item = new JMenuItem[channelList.size()];
         
        for(int i = 0; i < channelList.size(); i++)
        {
            Channel channel = channelList.get(i);
            view_item[i] = new JMenuItem(channel.getName());
            view.add(view_item[i]);
            view_item[i].addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    readactionlistener.actionPerformed(e);
                }
            });
        }
         
        JMenuItem item_dao = new JMenuItem("导出(D)",KeyEvent.VK_D);
        item_dao.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,ActionEvent.CTRL_MASK));
        item_dao.addActionListener(new ActionListener()
        {  
            public void actionPerformed(ActionEvent e)
            {
                ExportActionListener export = new ExportActionListener();
                export.actionPerformed(e);
            }
        });
         
        JMenuItem item_ESC = new JMenuItem("退出(X)",KeyEvent.VK_X);
        item_ESC.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,ActionEvent.CTRL_MASK));
        item_ESC.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
         
        menuBar.add(menu);
        menuBar.add(help);
         
        menu.add(view);
        menu.add(item_dao);
        menu.add(item_ESC);
         
        return menuBar;
    }
     
    class ReadActionListener implements ActionListener
    {
        /**
         * 新闻内容读取功能
         *
         */
        public void actionPerformed(ActionEvent e)
        {
            showNews(e.getActionCommand());
        }
    }
     
    private void showNews(String name)             
    {
        /**
         * 把新闻显示功能独立成一个方法
         */
         
        Channel selectedChannel = new Channel();
        for(int i = 0; i < channelList.size(); i++)
        {
            selectedChannel = channelList.get(i);
            if(selectedChannel.getName() == name)
            {
                select = i;
                break;
            }
        }
        String filePath = selectedChannel.getFilePath();
        newsList = rssService.getNewsList(filePath);
        jtaContent.setText("");
        showTable(newsList);
    }
     
    class ExportActionListener implements ActionListener
    {
        /**
         * 导出按钮的动作事件
         */
        public void actionPerformed(ActionEvent e)
        {
            if(newsList == null)
            {
                Channel channel = channelList.get(select);
                String filePath = channel.getFilePath();
                newsList = rssService.getNewsList(filePath);
            }
            if(rssService.save())
                showJdialogMessage.showJdialog("新闻信息保存成功!");
            else
                showJdialogMessage.showJdialog("新闻信息保存失败!");
        }
    }
     
    private JPanel getJPMain()              //窗口面板
    {
        JPanel jpMain = new JPanel();       //主面板
        jpMain.setLayout(new BorderLayout());
        jpMain.add(getJTBMy(), BorderLayout.NORTH);
         
        jpMain.add(getJSPLeft() ,BorderLayout.CENTER);
        jpMain.add(getJSBMy(),BorderLayout.SOUTH);
        return jpMain;
    }
     
    private JSplitPane getJSPLeft()                 //左右面板分割
    {
        JSplitPane jsLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
         
        jsLeft.setDividerLocation(180);
         
        jsLeft.setLeftComponent(getJTree());
         
        jsLeft.setRightComponent(getJSPClientArea());
         
        return jsLeft;
    }
     
    private JScrollPane getJTree()              //获取树形控件
    {
        String[] name = new String[10];
        for(int i = 0; i < channelList.size(); i++)
        {
            Channel channel = channelList.get(i);
            name[i] = channel.getName();
        }
         
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("新闻列表");
        DefaultMutableTreeNode t1 = new DefaultMutableTreeNode("腾讯新闻");
        DefaultMutableTreeNode t2 = new DefaultMutableTreeNode("新浪新闻");
         
        DefaultMutableTreeNode t1_1 = new DefaultMutableTreeNode(name[0]);
        DefaultMutableTreeNode t1_2 = new DefaultMutableTreeNode(name[1]);
        DefaultMutableTreeNode t2_1 = new DefaultMutableTreeNode(name[2]);
        DefaultMutableTreeNode t2_2 = new DefaultMutableTreeNode(name[3]);
         
        root.add(t1);
        root.add(t2);
         
        t1.add(t1_1);
        t1.add(t1_2);
        t2.add(t2_1);
        t2.add(t2_2);
         
        final JTree jtree = new JTree(root);
         
        jtree.addTreeSelectionListener(new TreeSelectionListener()
        {
            public void valueChanged(TreeSelectionEvent e)
            {
                DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)jtree.getLastSelectedPathComponent();
                if(selectedNode == null)
                    return ;
                if(selectedNode.isLeaf())
                {
                    showNews(selectedNode.toString());
                }
            }
        });
         
        JScrollPane jtTreePanel = new JScrollPane(jtree);// 将树放在滚动面板中
        return jtTreePanel;
    }
     
    public JToolBar getJTBMy()          //工具栏
    {
        JToolBar jtTool = new JToolBar();
        jtTool.setLayout(new FlowLayout(FlowLayout.LEFT));
        jtTool.add(getJBExport());
        jtTool.add(getJBUpdate());
        jtTool.add(getJBExit());
        return jtTool;
    }
     
    private JSplitPane getJSPClientArea()                   //分割面板
    {
        JSplitPane jspVertical = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
         
        jspVertical.setDividerLocation(240);
         
        jspVertical.setLeftComponent(getJSPTable());
         
        jspVertical.setRightComponent(getJSPContent());
         
        return jspVertical;
    }
     
    private JPanel getJSBMy()                       //状态栏
    {
        JPanel status = new JPanel();
        status.setLayout(new FlowLayout(FlowLayout.LEFT));
         
        JLabel jlStatus = new JLabel("www.ruanko.com");
        status.add(jlStatus);
         
        return status;
    }
     
    private JScrollPane getJSPContent()             //新闻文本区
    {
        JScrollPane jspContent = null;
        if(jtaContent == null)
        {
            jtaContent = new JTextArea();
            jtaContent.setLineWrap(true);           //文本区的换行策略
            jspContent = new JScrollPane(jtaContent);
            jspContent.setPreferredSize(new Dimension(780, 260));
        }
        return jspContent;
    }
     
    private void showTable(List<News> newsList)               //新闻内容以表格显示
    {
        //清空表格的内容
        int rowCount = dtmTableModel.getRowCount();
        while(rowCount > 0)
        {
            dtmTableModel.removeRow(0);
            rowCount--;
        }
         
        //遍历新闻内容列表,将相应的新闻内容显示到表格中
        for(int i = 0; i < newsList.size(); i++ )
        {
            News news = newsList.get(i);
             
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd- HH:mm:ss");
            Date date = new Date();
            String currentDate = dateFormat.format(date);
             
            String[] data = {news.getTitle(),currentDate,news.getPubDate(),news.getAuthor()};
            dtmTableModel.addRow(data);
        }
    }
     
    private JScrollPane getJSPTable()               //表格内容单击事件处理
    {
        JScrollPane jspTable = null;
        if(jtTable == null)
        {
            dtmTableModel = new DefaultTableModel();
            dtmTableModel.addColumn("主题");
            dtmTableModel.addColumn("接收时间");
            dtmTableModel.addColumn("发布时间");
            dtmTableModel.addColumn("作者");
             
            jtTable = new JTable(dtmTableModel);
             
            jtTable.addMouseListener(new MouseAdapter()
            {
                /**
                 * 重写mouseClicked() 方法处理鼠标点击事件
                 */
                public void mouseClicked(MouseEvent e)
                {
                    if(e.getButton() == MouseEvent.BUTTON1)
                    {
                        int selectedRow = jtTable.getSelectedRow();
                        News selectedNews = newsList.get(selectedRow);
                        jtaContent.setText(rssService.newsToString(selectedNews));
                    }
                }
            });
            jspTable = new JScrollPane(jtTable);
        }
        return jspTable;
    }
     
    private JButton getJBExport()   //导出按钮
    {
        if(jbExport == null)
        {
            ImageIcon icon = new ImageIcon("images/export.png");
            jbExport = new JButton(icon);
            jbExport.setToolTipText("导出");
            jbExport.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    ExportActionListener export = new ExportActionListener();
                    export.actionPerformed(e);
                }
            });
        }
        return jbExport;
    }
     
     
    private JButton getJBUpdate()               //更新按钮
    {
        if(jbUpdate == null)
        {
            ImageIcon icon = new ImageIcon("images/update.png");
            jbUpdate = new JButton(icon);
            jbUpdate.setToolTipText("更新新闻内容");
            jbUpdate.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    UpdateThread up = new UpdateThread();
                    up.start();
                }
            });
        }
        return jbUpdate;
    }
     
    private JButton getJBExit()                     //退出按钮
    {
        if(jbExit == null)
        {
            ImageIcon icon = new ImageIcon("images/exit.png");
            jbExit = new JButton(icon);
            jbExit.setToolTipText("退出RSS阅读器");
            jbExit.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            });
        }
        return jbExit;
    }
}

[源代码打包下载]




网友评论    (发表评论)

共2 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...