[java]代码库
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("<html><body>作者:北京交通大学 段学宇<br>日期:2017年10月29日</body></html>");
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();
}
}
};
}
[源代码打包下载]