swing实现自动完成(智能匹配)功能--紫枫凝潇烟

原创 2007年10月07日 14:46:00

近日完成了一个较复杂的JTree结构,并提供搜索功能,想着在搜索时再加个智能匹配的功能应该能提高用户体验,于是先完成了这个示例 ,效果就不贴图了,就是类似google的suggest那样的智能匹配功能,代码如下

 

package swingdemo;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashSet;
import java.util.Set;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;


public class IntelligentMatch extends JFrame{


    
private JTextField keywordField;

    
private JPopupMenu popupMenu;
    
private JList cacheKeywordList;
    
private Set<String> cacheKeyword = new HashSet<String>();
    
private Set<String> matchResultSet = new HashSet<String>();
    
private ResultListModel resultListModel;
    
private ListListener listListener = new ListListener();
    
    
public IntelligentMatch(){
        
super();
        init();
        
    }

    
    
public void init(){
        keywordField 
= new JTextField(22);
        Listener listener 
= new Listener();
        KeyDisposer keyListener 
= new KeyDisposer();
        keywordField.registerKeyboardAction(listener,KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 
0false),JComponent.WHEN_FOCUSED);
        
        JButton searchButton 
= new JButton("Search");
        searchButton.addMouseListener(listener);
        resultListModel 
= new ResultListModel();
        cacheKeywordList 
= new JList(resultListModel);
        cacheKeywordList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        cacheKeywordList.registerKeyboardAction(listListener,KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 
0false),JComponent.WHEN_FOCUSED);
        JComponent tipFrame 
= new JScrollPane(cacheKeywordList);
        tipFrame.setPreferredSize(
new Dimension(240,100));
        System.out.println(keywordField.getWidth());
        popupMenu 
= new JPopupMenu();
        popupMenu.add(tipFrame);
        keywordField.addKeyListener(keyListener);
        
        Container pane  
= getContentPane();
        pane.setLayout(
new BorderLayout());
        JPanel searchPanel 
= new JPanel();
        searchPanel.add(keywordField);
        searchPanel.add(searchButton);
        pane.add(searchPanel,BorderLayout.NORTH);
        JTable table 
= new JTable();
        pane.add(table,BorderLayout.CENTER);
        
        setSize(
500,300);
        setVisible(
true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    
    
private void doSearch(){
        String keyWord 
= keywordField.getText().trim();
        
if(!keyWord.equals("")){
            cacheKeyword.add(keyWord);
        }

        keywordField.setText(
"");
        
// do search .....
        new Thread(new Runnable(){

            
public void run() {
                
// searching...
            }

            
        }
).start();
    }

    
    
public void showMatch(){
        String keyWord 
= keywordField.getText().trim();
        
if(keyWord.equals("")){
            popupMenu.setVisible(
false);
            
return;
        }

        Set
<String> matchResult = getMatch(keyWord);
        
if(matchResult==null || matchResult.size()<1){
            popupMenu.setVisible(
false);
            
return;
        }

        resultListModel.removeAllElements();
        
for(String result:matchResult)
            resultListModel.addElement(result);
        popupMenu.show(keywordField,
0, keywordField.getHeight());
        cacheKeywordList.setSelectedIndex(
0);
        keywordField.requestFocus();
    }

    
    
private Set<String> getMatch(String content){
        Set
<String> tempSet = new HashSet<String>();
        
for(String temp:cacheKeyword)
            
if(temp.indexOf(content)!=-1)
                tempSet.add(temp);
        
return tempSet;
    }

    

    
public static void main(String[] args) {
        
new IntelligentMatch();
    }


    
    
    
    
/**inner class for answering event*/
    
private class KeyDisposer extends KeyAdapter{
        
public void keyReleased(KeyEvent e){
            
if(e.getKeyCode()==27){
                popupMenu.setVisible(
false);
            }
else if(e.getKeyCode()==40){
                popupMenu.setVisible(
true);
                cacheKeywordList.requestFocus();
                
if(resultListModel.size()>=2)
                    cacheKeywordList.setSelectedIndex(
1);
            }
else if(e.getKeyCode()==38){
                popupMenu.setVisible(
true);
                cacheKeywordList.requestFocus();
                cacheKeywordList.setSelectedIndex(resultListModel.size()
-1);
            }
else if(e.getKeyCode()==KeyEvent.VK_ENTER){
                
            }
else {
                showMatch();
            }

        }

    }

    
class Listener extends MouseAdapter implements ActionListener{

        
public void actionPerformed(ActionEvent e){
            
if(popupMenu.isShowing())
                listListener.actionPerformed(e);
            
else
                executeClick();
            }

        
public void mouseClicked(MouseEvent event){
            executeClick();
        }

        
private void executeClick(){
            doSearch();
        }

    }

    
private class ListListener implements ActionListener{
        
public void actionPerformed(ActionEvent e){
                
            keywordField.setText(cacheKeywordList.getSelectedValue().toString());
            popupMenu.setVisible(
false);
            keywordField.requestFocus();
        }

    }

    
private class ResultListModel extends DefaultListModel{
        ResultListModel()
{
            
//load the default cache keyword ---gavin
            for(String matchKeyword : matchResultSet)
                addElement(matchKeyword);
        }

    }


    


}

如果有正好需要这方面功能的可以参考一下,如果您看到的是转载的文章,请记得原地址是http://blog.csdn.net/cleverfoxloving

相关文章推荐

ASP.net+AJAX智能匹配检索(自动完成)

实例说明 使用谷歌搜索引擎,用户只要输入部分关键字,就能够显示相关搜索提示信息列表。 技术要点 本实例的核心技术是通过ASP.NET AJAX Control Toolkit中的AutoComp...

让你的Entity实现自动装配的功能,swing也玩form表单赋值

最近玩swing 编程,做个小项目,发现表单赋值给实体时有点麻烦,于是走了点弯路,实现表单的自动装配,主要是让实体增加反射赋值的方法 这样做对不对,大神别喷 先定义一个装配接口 SimpleEn...

自己动手设计代码编辑器——(四)代码智能提示(自动完成功能)

本来我的编辑器没有自动完成功能的,而且本来应该继续讲代码的载入与分析的。 但刚好做了上一节的功能后,我临时做出来了,趁热写出来。 代码自动完成,按自己的理解做的,不知道别人是怎么实现的,先...

JQuery+ajax实现类似百度搜索自动匹配功能

引言    我们接触最多的、用的最多的搜索引擎就是百度了,可以说现在我们的生活如果离开像百度、谷歌这样的搜索引擎还是我们的生活没有了方向,我们在使用的时候都有一个体验就是我我们在输入关键紫的时候,他会...

文本框自动提示匹配查询功能

  • 2014年08月21日 00:24
  • 295KB
  • 下载

Swing—— JTextArea实现简单的自动完成

public class TextAreaDemo extends JFrame implements DocumentListener { private JLabel label; ...

java Swing中JTextField自动补全功能例子

涉及到两个Java类 主类:AutoCompleteComponet.java 数据类:AutoCompleteComponet.java 效果图如下: 代码如下: 主类:AutoCompl...

关于租房匹配的链接功能实现

  • 2017年03月28日 14:02
  • 12KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swing实现自动完成(智能匹配)功能--紫枫凝潇烟
举报原因:
原因补充:

(最多只允许输入30个字)