⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rssfeedgui.java

📁 RssFeed阅读器,可以任意加入删除管理任何RSS FEED,采用多性程打开你所关注的新闻内容。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -