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 newsList; //新闻内容列表 private static List 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 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; } }