用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...