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

📄 history_filtered_jlist.java

📁 具有历史记录的过滤JList
💻 JAVA
字号:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

import javax.swing.AbstractAction;
import javax.swing.AbstractListModel;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;


public class History_Filtered_JList extends JList{

	private FilterField filterField;
	private int DEFAULT_FIELD_WIDTH = 20;
	
	public History_Filtered_JList() {
		super();
		setModel(new FilterModel());
		filterField = new FilterField(DEFAULT_FIELD_WIDTH);
		
	}
	
	public void setModel(ListModel m){
		if(!(m instanceof FilterModel))
			throw new IllegalArgumentException();
		super.setModel(m);
		
	}
	
	public void addItem(Object o){
		((FilterModel)getModel()).addElement(o);
	}
	
	public FilterField getFilterField(){
	
		return filterField;
	}
	
	//inner class FilterModel
	class FilterModel extends AbstractListModel {
		
		ArrayList items;
		ArrayList filterItems;
		
		public FilterModel(){
			
			super();
			items = new ArrayList();
			filterItems = new ArrayList();
		}
		
		public Object getElementAt (int index){
			
			if(index < filterItems.size())
				return filterItems.get(index);
			else 
				return null;
		}
		
		public int getSize(){
			
			return filterItems.size();
		}
		
		public void addElement(Object o){
			
			items.add(o);
			refilter();
		}
		
		private void refilter(){
			
			filterItems.clear();
			String term = getFilterField().textField.getText();
			term = term.toUpperCase();
			for(int i=0;i<items.size();i++){
				if(items.get(i).toString().toUpperCase().indexOf(term,0) != -1)
					filterItems.add(items.get(i));
			}
			fireContentsChanged(this,0,getSize());
		}
	}
	
	//inner class FilterField
	class FilterField extends JComponent implements DocumentListener,ActionListener {
		
		LinkedList prevSearches;
		JTextField textField;
		JButton prevSearchButton;
		JPopupMenu prevSearchMenu;
		
		public FilterField(int width) {
			
			super();
			setLayout(new BorderLayout());
			textField = new JTextField(width);
			textField.getDocument().addDocumentListener(this);
			textField.addActionListener(this);
			prevSearchButton = new JButton(new ImageIcon("history.png"));
			prevSearchButton.setBorder(null);
			prevSearchButton.addMouseListener(new MouseAdapter(){
				public void mousePressed(MouseEvent me){
					popMenu(me.getX(),me.getY());
				}
			});
			add(prevSearchButton,BorderLayout.WEST);
			add(textField,BorderLayout.CENTER);
			prevSearches = new LinkedList();
		}
		
		public void popMenu(int x,int y){
			
			prevSearchMenu = new JPopupMenu();
			Iterator it = prevSearches.iterator();
			while(it.hasNext()){
				prevSearchMenu.add(new PrevSearchAction(it.next().toString()));
			}
			prevSearchMenu.show(prevSearchButton,x,y);
		}
		
		public JTextField getTextField() {
			return textField;
		}

		public void changedUpdate(DocumentEvent e){
			
			((FilterModel)getModel()).refilter();
		}

		public void insertUpdate(DocumentEvent e) {
			
			((FilterModel)getModel()).refilter();
		}

		public void removeUpdate(DocumentEvent e) {
			
			((FilterModel)getModel()).refilter();
		}

		public void actionPerformed(ActionEvent e) {
			//called on return/enter,adds term to prevSearches
			if(e.getSource() == textField){
				prevSearches.addFirst(textField.getText());
				if(prevSearches.size()>10){
					prevSearches.removeLast();
					
				}
			}
		}
	}
	
	class PrevSearchAction extends AbstractAction {
		
		String term;
		
		public PrevSearchAction(String s){
			term = s;
			putValue(Action.NAME,term);
		}
		
		public String toString(){
			return term;
		}
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			getFilterField().textField.setText(term);
		}
	}
	
	public static void main(String [] args){
		
		String [] listItems = {
				"Chris","Joshua","Daniel","Michael",
				"Don","Kimy","Kelly","Keagan"
		};
		
		JFrame frame = new JFrame ("FileredJList");
		frame.getContentPane().setLayout(new BorderLayout());
		
		//populate list
		History_Filtered_JList list = new History_Filtered_JList();
		for (int i=0;i<listItems.length;i++)
			list.addItem(listItems[i]);
		
		//add to GUI
		JScrollPane pane = new JScrollPane(list,
										ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
										ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		frame.getContentPane().add(pane,BorderLayout.CENTER);
		frame.getContentPane().add(list.getFilterField(),BorderLayout.NORTH);
		
		frame.pack();
		frame.setVisible(true);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -