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

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

涉及到两个Java类 主类:AutoCompleteComponet.java 数据类:AutoCompleteComponet.java 效果图如下: 代码如下: 主类:AutoCompl...
  • zp357252539
  • zp357252539
  • 2015年08月12日 18:54
  • 14185

iPhone开发初试锋芒 一个简单的iPhone播放器 --紫枫凝潇烟

一个入门的iPhone播放器程序。
  • cleverfoxloving
  • cleverfoxloving
  • 2010年07月08日 21:21
  • 1400

java代码生成器--紫枫凝潇烟自主开发的代码生成器

如果能把项目中大量的代码编写工作变得轻松,是多好的一件事!在velocity出现之后,我突然有个想法,利用velocity这个优秀的模板引擎,把开发项目中的重复代码让它自动生成生成之后的基础代码,按照...
  • cleverfoxloving
  • cleverfoxloving
  • 2007年09月12日 11:55
  • 1983

swing中的JTextArea控制行数(修改一下可以改为控制字符数)--紫枫凝潇

近日做了一个工具用来验证一点东西,开启多线程验证时,把验证过程中的一些结果输出到JTextArea面板中,早就知道TextArea没有提供控制字符或者控制行数的功能,只不过我以前的输出内容 不会太多,...
  • cleverfoxloving
  • cleverfoxloving
  • 2007年10月24日 12:09
  • 967

【输入智能提示功能】PHP+jQuery实现自动补全功能

前面手工写了一个下拉自动补全功能,写的简单,只实现了鼠标选择的功能,不支持键盘选择。由于项目很多地方要用到这个功能,所以需要用心做一下。发现select2这个插件的功能可以满足当前需求。 在...
  • wustzbq0713
  • wustzbq0713
  • 2015年01月25日 12:29
  • 808

JavaSwing仿QQ实现智能对话

---第二站--- 在上次的基础上经过反复的考虑,遂决定添加一个图灵机器人,实现智能对话的功能。以下是分析过程和代码部分: 一:如何接入图灵机  ①在图灵机器人的官网申请一个用户名,如何会给你一...
  • qq_23856963
  • qq_23856963
  • 2015年01月29日 16:35
  • 1400

紫米10000mAh智能移动电源APP功能分析报告

紫米10000mAh智能移动电源APP功能分析报告  快速充电器正式发布后,小米旗下生态链伙伴紫米今天在小米官方众筹平台上推出了“ZMI智能移动电源”,具体型号HB810,号称全球首款智能移动电源,不...
  • qq_31389903
  • qq_31389903
  • 2016年03月18日 11:04
  • 3039

[Swing]实现一个文本自动完成工具

//-------------------------------------------------------------------------------- 2010.10.17 重新整...
  • a78460750
  • a78460750
  • 2013年07月19日 17:52
  • 1535

自动补全文本框

android自动补全文本框  高级控件 今天给大家带来一个android的高级控件 ,一般用来写自动补全的文本框                           这里先定义一个简...
  • good_idea_
  • good_idea_
  • 2017年06月08日 18:57
  • 186

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

实例说明 使用谷歌搜索引擎,用户只要输入部分关键字,就能够显示相关搜索提示信息列表。那么在这里我们通过ASP.NET来实现这样的功能,程序运行结果如图18.2所示。 图18.2  智能匹配检索技术要点...
  • fengying0529
  • fengying0529
  • 2009年07月18日 10:53
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swing实现自动完成(智能匹配)功能--紫枫凝潇烟
举报原因:
原因补充:

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