📄 rssfeedgui.java
字号:
package RssFeeds;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.event.ListSelectionEvent;
public class RssFeedGUI extends JFrame {
private static final long serialVersionUID = 20081010;
private JTextField feedNameTxt;
private JTextField feedTitleTxt;
private JTextField feedLinkTxt;
private JTextField feedDateTxt;
private JTextArea feedDescTxt;
private JButton addFeedBtn;
private JButton delFeedBtn;
private JButton delItemBtn;
private JList feedNameList;
private JList feedItemList;
private JLabel htmlLabel;
private JFrame frameDialog ;
private RssFeedData data;
// for saving the downloaded article cache
private Map<String, String> saveArticleMap;
/**
* constructor for GUI's initialization
* @param data
* feed data object
*/
public RssFeedGUI(RssFeedData data) {
this.data = data;
saveArticleMap = new TreeMap<String, String>();
InitRssFeedGUI();
// add listeners to interactive components
addButtonListeners(new ButtonListener());
delFeedListeners(new ButtonListener());
delItemListeners(new ButtonListener());
addFeedListListener(new FeedListListener());
addItemListListener(new ItemListListener());
addExitListener(new ExitListener());
setTitle("RSS Feed Viewer");
setMinimumSize(new Dimension(800,600));
pack();
setVisible(true);
}
/**
* feed GUI setting up
*/
public void InitRssFeedGUI() {
Container contentPane = this.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
contentPane.add(Box.createVerticalStrut(20));
contentPane.add(makeFeedNamePanel());
contentPane.add(makeFeedListAndBtnPanel());
contentPane.add(makeFeedItemAndBtnPanel());
contentPane.add(makeLinkPanel());
// contentPane.add(Box.createVerticalStrut(10));
contentPane.add(makeTopicPanel());
}
/**
* make feed name input panel
* @return
* feed name panel
*/
private JPanel makeFeedNamePanel() {
JPanel feedNamePan = new JPanel();
Border border;
Color color;
JLabel feedNameLabel = new JLabel("Feed Name");
feedNameTxt = new JTextField(55);
addFeedBtn = new JButton("Add Feed");
feedNamePan.add(feedNameLabel);
feedNamePan.add(feedNameTxt);
feedNamePan.add(addFeedBtn);
color = Color.blue;
border = BorderFactory.createLineBorder(color, 1);
feedNamePan.setBorder(border);
feedNamePan.setMinimumSize(new Dimension(800,30));
feedNamePan.setPreferredSize(new Dimension(800,40));
feedNamePan.setMaximumSize(new Dimension(800,50));
return feedNamePan;
}
/**
* make feed name list and name delete function panel
* @return
* feed name operation panel
*/
private JPanel makeFeedListAndBtnPanel() {
Border border;
JPanel feedListPan = new JPanel();
feedNameList = new JList(data.getListFeedNameModel());
delFeedBtn = new JButton("Delete Feed");
delFeedBtn.setBounds(0, 0, 50, 50);
delFeedBtn.setPreferredSize(new Dimension(100, 100));
JScrollPane feedScrollNamePan = new JScrollPane(feedNameList);
feedScrollNamePan.setViewportView(feedNameList);
feedScrollNamePan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
feedScrollNamePan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
feedScrollNamePan.setMinimumSize(new Dimension(650,100));
feedScrollNamePan.setPreferredSize(new Dimension(650,110));
feedScrollNamePan.setMaximumSize(new Dimension(650,200));
border = BorderFactory.createLoweredBevelBorder();
feedScrollNamePan.setBorder(BorderFactory.createTitledBorder(border,"RSS Feed Name"));
feedNameList.setBorder(border);
feedNameList.setEnabled(true);
feedListPan.add(feedScrollNamePan);
feedListPan.add(delFeedBtn);
feedListPan.setBorder(BorderFactory.createLineBorder(Color.BLUE));
feedListPan.setMinimumSize(new Dimension(800,100));
feedListPan.setPreferredSize(new Dimension(800,110));
feedListPan.setMaximumSize(new Dimension(800,200));
return feedListPan;
}
/**
* make feed item list and delete function panel
* @return
* feed item operation panel
*/
private JPanel makeFeedItemAndBtnPanel() {
Border border;
JPanel feedItemPan = new JPanel();
feedItemList = new JList(data.getListFeedItemModel());
delItemBtn = new JButton("Delete Item");
delItemBtn.setBounds(0, 0, 50, 50);
delItemBtn.setPreferredSize(new Dimension(100, 100));
JScrollPane feedScrollItemPan = new JScrollPane(feedItemList);
feedScrollItemPan.setViewportView(feedItemList);
feedScrollItemPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
feedScrollItemPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
feedScrollItemPan.setMinimumSize(new Dimension(650,100));
feedScrollItemPan.setPreferredSize(new Dimension(650,110));
feedScrollItemPan.setMaximumSize(new Dimension(650,200));
border = BorderFactory.createLoweredBevelBorder();
feedScrollItemPan.setBorder(BorderFactory.createTitledBorder(border,"RSS Feed Items"));
feedItemList.setBorder(border);
feedItemList.setEnabled(true);
feedItemPan.add(feedScrollItemPan);
feedItemPan.add(delItemBtn);
feedItemPan.setBorder(BorderFactory.createLineBorder(Color.BLUE));
feedItemPan.setMinimumSize(new Dimension(800,100));
feedItemPan.setPreferredSize(new Dimension(800,110));
feedItemPan.setMaximumSize(new Dimension(800,200));
return feedItemPan;
}
/**
* make showing feed items panel
* @return
* feed items panel
*/
private JPanel makeLinkPanel() {
JPanel linkPan = new JPanel();
Border border;
Color color;
GroupLayout layout = new GroupLayout(linkPan);
linkPan.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
JLabel lblTitle = new JLabel("Title");
JLabel lblLink = new JLabel("Link");
JLabel lblDate = new JLabel("Date Published");
JLabel lblDesc = new JLabel("Description");
feedTitleTxt = new JTextField(40);
feedLinkTxt = new JTextField(40);
feedDateTxt = new JTextField(40);
feedDescTxt = new JTextArea();
feedTitleTxt.setEditable(false);
feedLinkTxt.setEditable(false);
feedDateTxt.setEditable(false);
feedDescTxt.setEditable(false);
JScrollPane descScrollPan = new JScrollPane(feedDescTxt);
descScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
descScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
descScrollPan.setMinimumSize(new Dimension(800,30));
descScrollPan.setPreferredSize(new Dimension(800,40));
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
hGroup.addGroup(layout.createParallelGroup().addComponent(lblTitle)
.addComponent(lblLink).addComponent(lblDate).addComponent(lblDesc));
hGroup.addGroup(layout.createParallelGroup().addComponent(feedTitleTxt)
.addComponent(feedLinkTxt).addComponent(feedDateTxt).addComponent(descScrollPan));
layout.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblTitle).addComponent(feedTitleTxt));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblLink).addComponent(feedLinkTxt));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblDate).addComponent(feedDateTxt));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblDesc).addComponent(descScrollPan));
layout.setVerticalGroup(vGroup);
color = Color.blue;
border = BorderFactory.createLineBorder(color, 1);
linkPan.setBorder(border);
return linkPan;
}
/**
* make item topic showing panel
* @return
* item topic panel
*/
private JScrollPane makeTopicPanel() {
htmlLabel = new JLabel();
JScrollPane topicScrollPan = new JScrollPane(htmlLabel);
topicScrollPan.setMinimumSize(new Dimension(800,100));
topicScrollPan.setPreferredSize(new Dimension(800,250));
topicScrollPan.setMaximumSize(new Dimension(2048, 500));
topicScrollPan.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
topicScrollPan.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
return topicScrollPan;
}
/**
* Adds a listener to the addFeedBtn button
*/
private void addButtonListeners(ActionListener listener) {
addFeedBtn.addActionListener(listener);
}
/**
* Adds a listener to the delFeedBtn button
*/
private void delFeedListeners(ActionListener listener) {
delFeedBtn.addActionListener(listener);
}
/**
* Adds a listener to the delItemBtn button
*/
private void delItemListeners(ActionListener listener) {
delItemBtn.addActionListener(listener);
}
/**
* Adds a listener to the Feed name list
*/
private void addFeedListListener(ListSelectionListener listener) {
feedNameList.addListSelectionListener(listener);
}
/**
* Adds a listener to the Feed item list
*/
private void addItemListListener(ListSelectionListener listener) {
feedItemList.addListSelectionListener(listener);
}
/**
* Adds a listener to the JFrame
*/
private void addExitListener(WindowListener listener) {
addWindowListener(listener);
}
/**
* Handles events for the button on the UI.
*
* @author Jack
*
*/
private class ButtonListener implements ActionListener {
/**
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
JButton source = (JButton) e.getSource();
String input = getfeedInput(feedNameTxt.getText());
if (source == addFeedBtn) {
if(input != null)
AddNewFeed(input);
else {
JOptionPane.showMessageDialog(frameDialog,
"Input error !\n( Example: http://feeds.news.com.au/rss/news.xml )",
"Add new feed",
JOptionPane.ERROR_MESSAGE);
return;
}
}
else if(source == delFeedBtn) {
if(feedNameList.getSelectedValue()!= null
&& !feedNameList.getSelectedValue().equals("")) {
int n = JOptionPane.showConfirmDialog(frameDialog,
"Do you confirm to delete the feed ?",
"Rss Feed delete dialog",
JOptionPane.YES_NO_OPTION);
if(n == JOptionPane.YES_OPTION) {
DelSelFeed((String)feedNameList.getSelectedValue());
}
else
return;
}
else {
JOptionPane.showMessageDialog(frameDialog,
"Please select the feed you want to delete !",
"Delete feed",
JOptionPane.INFORMATION_MESSAGE);
return;
}
}
else if(source == delItemBtn) {
if(feedItemList.getSelectedValue()!= null
&& !feedItemList.getSelectedValue().equals("")) {
int n = JOptionPane.showConfirmDialog(frameDialog,
"Do you confirm to delete the item ?",
"Rss Item delete dialog",
JOptionPane.YES_NO_OPTION);
if(n == JOptionPane.YES_OPTION) {
DelSelItem((String)feedItemList.getSelectedValue());
}
else
return;
}
else {
JOptionPane.showMessageDialog(frameDialog,
"Please select the item you want to delete !",
"Delete item",
JOptionPane.INFORMATION_MESSAGE);
return;
}
}
}
/**
* obtain the feed input from user
* @param input
* input string
* @return
* the input string without ending with whitespace
* or null if it is not the xml file
*/
public String getfeedInput(String input) {
String temp = input;
while(temp.endsWith(" ")) {
temp = temp.substring(0, temp.length() - 1);
}
if(temp.endsWith(".xml"))
return temp;
else
return null;
}
/**
* delete the selected feed name
* @param sel
* the selected feed name
*/
private void DelSelFeed(String sel) {
RssFeedXMLDataSource delfeedmxl = new RssFeedXMLDataSource("RssFeed.xml");
data.delFeed(delfeedmxl, sel);
feedItemList.removeAll();
}
/**
* delete the selected feed item
* @param sel
* the selected feed item
*/
private void DelSelItem(String sel) {
String feedname;
RssFeedXMLDataSource delfeedmxl = new RssFeedXMLDataSource("RssFeed.xml");
feedname = (String)feedNameList.getSelectedValue();
if((feedname == null)||(sel == null))
return;
data.delItem(delfeedmxl, feedname, sel);
clearLinkPaneElements();
}
/**
* add new feed channel
* @param feedAddr
* the input feed address
*/
private void AddNewFeed(String feedAddr) {
//start a thread to download Rss Feed
new Thread(new RssFeedDownload(feedAddr)).start();
}
}
/**
* obtain the web page file name from the item link field
* @param addr
* the text of the item link field
* @return
* the web page file
*/
public String getFilenameFromLinkField(String addr) {
int lastSlashIndex = addr.lastIndexOf('/');
int lastQuestionIndex = addr.lastIndexOf('?');
if(lastQuestionIndex < 0) {
if(lastSlashIndex >= 0 &&
lastSlashIndex < addr.length() - 1 )
return addr.substring(lastSlashIndex + 1);
else
return null;
}
else {
if(lastSlashIndex >= 0 &&
lastSlashIndex < addr.length() - 1 &&
lastQuestionIndex < addr.length() - 1 &&
lastQuestionIndex > lastSlashIndex)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -