package rssreader.view; import rssreader.model.NewsFeed; import rssreader.model.URL; import rssreader.service.*; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Image; import java.awt.Label; import java.awt.Menu; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.net.URISyntaxException; import java.net.URLDecoder; import java.nio.Buffer; import java.util.HashMap; import java.util.Map; import org.jdom.*; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.JToolBar; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; import org.jdom.JDOMException; public class FrameMain extends JFrame{ public static Font font = new Font("宋体", Font.BOLD, 25); public static Font bigfont = new Font("宋体", Font.BOLD, 40); /**业务逻辑对象*/ private Service service; /**菜单面板中的控件*/ private JComboBox comboBox;//下拉框 private JButton readButton;//读取按钮 private JButton saveButton;//保存按钮 private JButton moreButton;//打开网页按钮 private JTextField newstitleText;//查询新闻标题输入框 private JButton queryButton;//查询按钮 private String uriaddress;//网页地址 private JLabel statusLabel;//状态栏 /**文件选择的文件项*/ /**新闻标题面板的控件*/ private JTable newsTitleTable;//新闻标题表格 private JTextPane textPaneNewsDescripation;//新闻内容文本框 //主面板构造器 public FrameMain() { // TODO Auto-generated constructor stub //创建业务逻辑对象 service=new Service(this); setTitle("RSS阅读器"); //设置窗体大小 setBounds(1000, 300, 1500, 1700); //添加主面板 JPanel contentePanel=getContentPanel(); setContentPane(contentePanel); //添加菜单 setJMenuBar(getJMenuBar()); } //主面板 private JPanel getContentPanel(){ JPanel panel=new JPanel(new BorderLayout()); //面板上添加工具栏 panel.add(getJToolBar(),BorderLayout.NORTH); panel.add(getCenterPanel(),BorderLayout.CENTER); panel.add(getStatusBar(),BorderLayout.SOUTH); return panel; } //面板组件 private JSplitPane getCenterPanel(){ JSplitPane splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitPane.setDividerLocation(650);//设置分割条位置 JPanel panel=new JPanel(new BorderLayout()); //添加功能 panel.add(getQueryPanel(),BorderLayout.NORTH); //新闻列表 panel.add(getTabelSollPanel(),BorderLayout.CENTER); //新闻内容 splitPane.setLeftComponent(panel); splitPane.setRightComponent(getTextSolPanel()); return splitPane; } //创建菜单 public JMenuBar getJMenuBar(){ //创建菜单条 JMenuBar menuBar=new JMenuBar(); //创建文件菜单 JMenu fileMenu=new JMenu("文件"); fileMenu.setMnemonic('F');//快捷键 fileMenu.setFont(bigfont); //把菜单添加到菜单栏 menuBar.add(fileMenu); //创建文件菜单项 JMenuItem open=new JMenuItem("打开.."); open.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub statusLabel.setText("读取文件"); JFrame jfFrame=new JFrame("选择一个RSS文件"); jfFrame.setVisible(true); jfFrame.setBounds(1400, 500, 600, 400); jfFrame.setLayout(null); jfFrame.add(getComboBox()).setBounds(150, 50, 300, 100); JButton read=new JButton("确定"); read.setFont(bigfont); jfFrame.add(read).setBounds(50, 200, 200, 100); read.addActionListener(readListener); read.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jfFrame.dispose(); } }); JButton exit=new JButton("取消"); exit.setFont(bigfont); jfFrame.add(exit).setBounds(300, 200, 200, 100); exit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub jfFrame.dispose(); } }); } }); open.setFont(bigfont); JMenuItem save=new JMenuItem("保存"); save.setFont(bigfont); save.addActionListener(saveListener); JMenuItem exit=new JMenuItem("退出"); exit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.exit(0); statusLabel.setText("退出"); } }); exit.setFont(bigfont); //添加菜单项到菜单 fileMenu.add(open); fileMenu.add(new JSeparator());//设置分割线 fileMenu.add(save); fileMenu.add(new JSeparator());//设置分割线 fileMenu.add(exit); //创建查询菜单 JMenu queryMenu=new JMenu("查询"); queryMenu.setFont(bigfont); queryMenu.setMnemonic('Q');//快捷键 menuBar.add(queryMenu); //创建查询菜单项 JMenuItem queryTitle=new JMenuItem("通过标题查找"); queryTitle.setFont(bigfont); JMenuItem queryAutor=new JMenuItem("通过作者查找"); queryAutor.setFont(bigfont); queryAutor.setEnabled(false); queryMenu.add(queryAutor); queryMenu.add(queryTitle); //帮助菜单 JMenu helpMenu=new JMenu("帮助"); helpMenu.setFont(bigfont); helpMenu.setMnemonic('h'); JMenuItem aboutAutor=new JMenuItem("关于作者"); aboutAutor.setFont(bigfont); aboutAutor.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub JFrame jFrame=new JFrame("关于作者"); jFrame.setVisible(true); jFrame.setSize(800, 400); jFrame.setLocationRelativeTo(null); JLabel jLabel=new JLabel("作者:北京交通大学 段学宇
日期:2017年10月29日"); jLabel.setFont(bigfont); jFrame.add(jLabel).setSize(600,200); } }); helpMenu.add(aboutAutor); menuBar.add(helpMenu); return menuBar; } //创建工具栏 private JToolBar getJToolBar(){ JToolBar toolBar=new JToolBar(); //添加工具栏组件 toolBar.add(getSaveButton());//保存按钮 toolBar.add(getQueryButton());//查询按钮 toolBar.add(getmoreButton());//访问按钮 toolBar.setFloatable(false); return toolBar; } //创建菜单面板 private JPanel getQueryPanel(){ JPanel menuPanel=new JPanel(); menuPanel.add(new Label("查询标题")).setFont(bigfont); menuPanel.add(getNewstitleText()); return menuPanel; } //创建表格面板 private JScrollPane getTabelSollPanel(){ JScrollPane tableSolPanel=new JScrollPane(); tableSolPanel.setViewportView(getNewsTitleTable()); tableSolPanel.setPreferredSize(new Dimension(1300, 650)); return tableSolPanel; } //创建文本框面板 private JScrollPane getTextSolPanel(){ JScrollPane messageSolePanel=new JScrollPane(); messageSolePanel.setViewportView(getTextPaneNewsDescription()); messageSolePanel.setPreferredSize(new Dimension(1300, 650)); return messageSolePanel; } /**控件初始化*/ public JComboBox getComboBox(){ if(comboBox==null){ comboBox=new JComboBox(); comboBox.setFont(bigfont); comboBox.addItem(new URL("腾讯-国际新闻","rss_newswj.xml")); comboBox.addItem(new URL("腾讯-国内新闻","rss_newsgn.xml")); comboBox.addItem(new URL("新浪-体育新闻","sports.xml")); comboBox.addItem(new URL("新浪-社会新闻","focus15.xml")); } return comboBox; } //读取按钮 public JButton getReadButton(){ if(readButton==null){ readButton=new JButton("读取"); readButton.setFont(bigfont); readButton.setToolTipText("读取文件");//按钮提示信息 readButton.addActionListener(readListener); } return readButton; } //保存按钮 public JButton getSaveButton(){ if(saveButton ==null){ ImageIcon icon=new ImageIcon("image/保存.png"); //ImageIcon icon=new ImageIcon("timg.jpg"); saveButton =new JButton(icon); saveButton.setToolTipText("保存文件");//按钮提示信息 saveButton.addActionListener(saveListener); } return saveButton ; } //访问按钮 public JButton getmoreButton(){ if(moreButton ==null){ ImageIcon icon=new ImageIcon("image/访问.png"); moreButton =new JButton(icon); moreButton.setToolTipText("访问该新闻所在页面");//按钮提示信息 moreButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub java.net.URI uri; try { statusLabel.setText("访问外部新闻"); uri = new java.net.URI(uriaddress); java.awt.Desktop.getDesktop().browse(uri); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); } return moreButton ; } //查询按钮 public JButton getQueryButton(){ if(queryButton ==null){ ImageIcon icon=new ImageIcon("image/查询.png"); queryButton =new JButton(icon); queryButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub statusLabel.setText("查询文件"); } }); } return queryButton; } //详细新闻显示框体 public JTextField getNewstitleText(){ if(newstitleText==null){ newstitleText=new JTextField(); newstitleText.setColumns(22); newstitleText.setFont(bigfont); } return newstitleText; } //新闻标题栏 public JTable getNewsTitleTable(){ if(newsTitleTable==null){ //创建新闻标题表格 newsTitleTable=new JTable(); //创建表格中的数据模型对象 myTableModel defaultModel=new myTableModel(new Object [50][9],new String [] {"主题", "接受时间", "发布时间", "作者"}); newsTitleTable.setModel(defaultModel); newsTitleTable.getTableHeader().setFont(bigfont); newsTitleTable.setFont(font); newsTitleTable.setRowHeight(50); //设置表格的行高 newsTitleTable.setEnabled(true); newsTitleTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置居中 /** * 标题表格监听器,创建新行事件 * */ newsTitleTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent arg0) { // TODO Auto-generated method stub //获得选中行的值 int row=newsTitleTable.getSelectedRow(); try { service.showMessage(row); uriaddress=service.geturiaddress(); //获得网址 statusLabel.setText(service.getTitle());//状态栏 } catch (Exception ex) { // TODO: handle exception //获得处理BadLocation异常信息 showError("文档转换操作异常:"+ex.getMessage()); } } } ); } return newsTitleTable; } protected void showError(String string) { // TODO Auto-generated method stub System.out.println(string); } public JTextPane getTextPaneNewsDescription(){ if(textPaneNewsDescripation==null){ //创建文本域 textPaneNewsDescripation=new JTextPane(); //不可编辑 textPaneNewsDescripation.setEditable(false); textPaneNewsDescripation.setFont(bigfont); } return textPaneNewsDescripation; } private JPanel getStatusBar(){ JPanel panel=new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); panel.add(new Label(" ")); statusLabel=new JLabel("北京交通大学软件学院"); statusLabel.setFont(bigfont); panel.add(statusLabel); return panel; } ActionListener readListener=new ActionListener() { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub /**目标文件*/ String inFile; /**显示错误信息*/ String errorInfo=""; //网址字符串 String address=""; //获得下拉框选中项 Object o=comboBox.getSelectedItem(); //获得工程目录 String dir=System.getProperty("user.dir"); //获得下拉框选中项的文件名,赋值给网址字符串 address=((URL)o).getAddress(); //获得解析文件完整路径 inFile=dir+"\\NewfeedFiles\\"+address; try{ //转编路径为UTF-8 inFile=URLDecoder.decode(inFile, "utf-8"); service.fileDo(inFile); }catch(IOException ioe){ //获得处理IO异常信息 errorInfo="系统找不到指定文件"; }catch(JDOMException jde){ errorInfo="解析文件异常"; jde.printStackTrace(); }finally{ showError(errorInfo); } } }; ActionListener saveListener=new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub statusLabel.setText("保存文件"); JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new FileNameExtensionFilter("文本文件(.txt)", "txt")); String path=null; JPanel parent = new JPanel(); int returnVal = chooser.showOpenDialog(parent); if (returnVal == JFileChooser.APPROVE_OPTION) { path=chooser.getSelectedFile().getPath(); } String filename=chooser.getSelectedFile().toString(); try { String text=null; text=service.getPassage(); if(text!=null){ File file=new File(filename+".txt"); FileWriter out = new FileWriter(file,true); out.write(service.getPassage()); System.out.println("保存成功,路径为"+filename+".txt"); out.close(); JFrame jFrame=new JFrame("保存成功"); jFrame.setVisible(true); jFrame.setSize(600, 400); jFrame.setLocationRelativeTo(null); JLabel jLabel=new JLabel("成功保存该内容!"); jLabel.setFont(bigfont); jFrame.add(jLabel).setSize(400,200); } else{ System.out.println("保存失败"); JFrame jFrame=new JFrame("保存失败"); jFrame.setVisible(true); jFrame.setSize(800, 400); jFrame.setLocationRelativeTo(null); JLabel jLabel=new JLabel("请在列表中选择一个要保存的内容!"); jLabel.setFont(bigfont); jFrame.add(jLabel).setSize(600,200); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }; }