📄 history_filtered_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 + -