Swing 类似百度搜索的效果 求高手帮忙完善一下

问题描述

packagecom.client.view;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.FlowLayout;importjava.awt.Point;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.DefaultListModel;importjavax.swing.JFrame;importjavax.swing.JList;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextField;importjavax.swing.JWindow;importjavax.swing.ListSelectionModel;importjavax.swing.ScrollPaneConstants;importjavax.swing.event.DocumentEvent;importjavax.swing.event.DocumentListener;importcom.client.pojo.Place;importcom.client.pojo.Unit;importcom.client.pojo.User;publicclassTestextendsJFrame{CompletableJTextFieldtextField;publicTest(){super();getContentPane().setLayout(newFlowLayout());Set<String>set=newHashSet<String>();set.add("abcdefg");set.add("abcdefghijkl");set.add("acdesdasijkl");set.add("esdasijklabcsd");set.add("aijklabcsd");set.add("alabcsd");set.add("asdasijklabcsd");set.add("asijklabcsd");set.add("aesdasijklabcsd");set.add("aabcsd");textField=newCompletableJTextField(0);textField.setPreferredSize(newDimension(200,30));textField.setCompletions(set);getContentPane().add(textField);setSize(400,300);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicstaticvoidmain(String[]args){newTest();}classCompletableJTextFieldextendsJTextField{privatestaticfinallongserialVersionUID=1L;JListcompletionList;DefaultListModelcompletionListModel;JScrollPanelistScroller;JWindowlistWindow;Setcompletions;StringcompletionString;publicCompletableJTextField(intcol){super(col);getDocument().addDocumentListener(newCompleter());completionListModel=newDefaultListModel();completionList=newJList(completionListModel);completionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);listScroller=newJScrollPane(completionList,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);listWindow=newJWindow();listWindow.setLocationRelativeTo(this);listWindow.setPreferredSize(newDimension(200,150));listWindow.getContentPane().add(listScroller);completionList.addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){if(e.getClickCount()==2){listWindow.setVisible(false);completionString=(String)completionList.getSelectedValue();setText(completionString);}}});addKeyListener(newKeyListener(){publicvoidkeyPressed(KeyEvente){intk=e.getKeyCode();intindex=completionList.getSelectedIndex();System.out.println("========================="+index);completionList.setVisibleRowCount(8);if(k==e.VK_DOWN){index=index+1;completionList.setSelectedIndex(index);}if(k==e.VK_UP){index=index-1;completionList.setSelectedIndex(index);}if(k==e.VK_ENTER){listWindow.setVisible(false);completionString=(String)completionList.getSelectedValue();if(completionString!=null){setText(completionString);}}}publicvoidkeyReleased(KeyEventarg0){}publicvoidkeyTyped(KeyEventarg0){}});}publicSetgetCompletions(){returncompletions;}publicvoidsetCompletions(Setcompletions){this.completions=completions;}classCompleterimplementsDocumentListener{privatePatternpattern;privatevoidbuildPopup(){completionListModel.clear();Iteratorit=completions.iterator();pattern=pattern.compile(getText()+".+");Matchermatcher=null;while(it.hasNext()){Stringcompletion=(String)it.next();matcher=pattern.matcher(completion);if(matcher.matches()){completionListModel.add(completionListModel.getSize(),completion);}}}privatevoidshowPopup(){if(completionListModel.getSize()==0){listWindow.setVisible(false);return;}Pointlos=getLocationOnScreen();intpopX=los.x;intpopY=los.y+getHeight();listWindow.setLocation(popX,popY);listScroller.setSize(newDimension(200,60));listWindow.pack();listWindow.setVisible(true);}privatevoidbuildAndShowPopup(){if(getText().length()<1){listWindow.setVisible(false);return;}else{buildPopup();showPopup();}}publicvoidchangedUpdate(DocumentEventarg0){buildAndShowPopup();}publicvoidinsertUpdate(DocumentEventarg0){buildAndShowPopup();}publicvoidremoveUpdate(DocumentEventarg0){buildAndShowPopup();}}}}这个程序求高手帮我完善一下,具体效果拷下来运行一下就知道了,现在效果不是很理想,缺陷1:不能循环选择缺陷2:JScrollPane的下拉工具不跟着我选择的项移动或者谁有更好的控件可以发我的邮箱yang.li@bonait.com}}这个程序求高手帮我完善一下,具体效果拷下来运行一下就知道了,现在效果不是很理想,缺陷1:不能循环选择缺陷2:JScrollPane的下拉工具不跟着我选择的项移动或者谁有更好的控件可以发我的邮箱yang.li@bonait.com

解决方案

解决方案二:
除了你说的,还有很多问题,难道你没有发现?弹出了窗体,加入我后面加一个按钮,我点按钮的时候,这个窗体应该隐藏起来吧?你这个做不到。所以这里建议不要用jwindow,当然使用也可以了,但需要额外处理。第一次启动,直接按向上键会抛出异常。这或许算是jdk处理的不太严谨的地方,如果是-1它会过滤掉,但如果是其他的负数,它却会继续执行而至出现异常。所以这地方,需要你处理,你给出大于最大的,不必担心,它会处理。至于你所说的两个问题,很容易处理。你还是先仔细规划设计一下,什么按键会有什么动作吧。现在有些乱。
解决方案三:
谢谢楼上给出的建议
解决方案四:
看到这些没注释的代码就难受。
解决方案五:
该回复于2010-10-22 16:25:11被版主删除
解决方案六:
该回复于2010-10-22 16:25:01被版主删除
解决方案七:
一定要用Jwindow吗.
解决方案八:
罢了,闲了一天,我自己写了一个。有些地方或许有不符的地方,你自己看着改改吧,或者跟我说看怎么改也可以。/***@author黯淡星辰*/publicclassImitateComponentextendsJTextField{privatestaticfinallongserialVersionUID=1L;privateVector<Object>allData;privateVector<Object>currentData;JPopupMenumenu;JListlist;privatebooleanshouldFilter=true;publicImitateComponent(Vector<Object>allData){super();this.allData=allData;currentData=newVector<Object>(allData);initComponents();addKeyListener(keyListener);getDocument().addDocumentListener(documentListener);}privatevoidinitComponents(){menu=newJPopupMenu();menu.setInvoker(this);menu.setInheritsPopupMenu(true);menu.setLightWeightPopupEnabled(true);list=newJList();list.setFixedCellHeight(25);list.setVisibleRowCount(10);list.setModel(newImitateListModel());list.addMouseListener(listMouseListener);menu.add(newJScrollPane(list));}privateclassImitateListModelextendsDefaultListModel{privatestaticfinallongserialVersionUID=1L;@OverridepublicintgetSize(){returncurrentData.size();}@OverridepublicObjectgetElementAt(intindex){returncurrentData.get(index);}}privatevoidfilterValues(StringfilterStr){currentData.clear();if(filterStr==null||"".equals(filterStr)){currentData.addAll(allData);}else{for(Iterator<Object>it=allData.iterator();it.hasNext();){Objectobj=it.next();StringsValue=obj==null?"":obj.toString();if(sValue.toUpperCase().startsWith(filterStr.toUpperCase())){currentData.add(obj);}}}list.setModel(newImitateListModel());list.setSelectedIndex(-1);showPopup();}privatevoidshowPopup(){Rectanglebounds=getBounds();Pointlocation=getLocationOnScreen();menu.setPopupSize(bounds.width,list.getFixedCellHeight()*list.getModel().getSize());menu.setLocation(location.x,location.y+bounds.height);menu.setVisible(true);requestFocus();}privateDocumentListenerdocumentListener=newDocumentListener(){@OverridepublicvoidremoveUpdate(DocumentEvente){if(shouldFilter){Stringtext=getText();filterValues(text);}}@OverridepublicvoidinsertUpdate(DocumentEvente){if(shouldFilter){Stringtext=getText();filterValues(text);}}@OverridepublicvoidchangedUpdate(DocumentEvente){}};privateKeyListenerkeyListener=newKeyListener(){@OverridepublicvoidkeyTyped(KeyEvente){}@OverridepublicvoidkeyReleased(KeyEvente){}@OverridepublicvoidkeyPressed(KeyEvente){Stringtext=getText();if(e.getKeyCode()==KeyEvent.VK_UP){shouldFilter=false;if(!menu.isVisible()){filterValues(text);}else{intindex=list.getSelectedIndex();index--;index=index<0?list.getModel().getSize()-1:index;list.setSelectedIndex(index);Objectobj=list.getModel().getElementAt(index);setText(obj==null?"":obj.toString());}shouldFilter=true;}elseif(e.getKeyCode()==KeyEvent.VK_DOWN){shouldFilter=false;if(!menu.isVisible()){filterValues(text);}else{intindex=list.getSelectedIndex();index++;index=index>=list.getModel().getSize()-1?0:index;list.setSelectedIndex(index);Objectobj=list.getModel().getElementAt(index);setText(obj==null?"":obj.toString());}shouldFilter=true;}elseif(e.getKeyCode()==KeyEvent.VK_ENTER){shouldFilter=false;if(!menu.isVisible()){filterValues(text);}else{intindex=list.getSelectedIndex();if(index<0){return;}Objectobj=list.getModel().getElementAt(index);setText(obj==null?"":obj.toString());menu.setVisible(false);}shouldFilter=true;}}};privateMouseAdapterlistMouseListener=newMouseAdapter(){publicvoidmouseClicked(java.awt.event.MouseEvente){intindex=list.getSelectedIndex();Objectobj=list.getModel().getElementAt(index);setText(obj==null?"":obj.toString());menu.setVisible(false);}};}

测试窗口:publicclassImitateFrameextendsJFrame{privatestaticfinallongserialVersionUID=1L;privateString[]values=newString[]{"ab","ac","ad","bc","bd","cc"};publicImitateFrame(){super();setDefaultCloseOperation(EXIT_ON_CLOSE);installComponents();setSize(600,400);setLocationRelativeTo(null);setVisible(true);}privatevoidinstallComponents(){Containerc=getContentPane();c.setLayout(newBorderLayout());c.add(newImitateComponent(newVector<Object>(Arrays.asList(values))),BorderLayout.NORTH);}publicstaticvoidmain(String[]args){newImitateFrame();}}

解决方案:
修正一个错误:index=index>=list.getModel().getSize()-1?0:index;

在处理vk_down的时候,这行代码不正确。应替换为:index=index>list.getModel().getSize()-1?0:index;

否则最后一项选不上。
解决方案:
头晕。晕的厉害。
解决方案:
好长的代码!!看的眼花了!
解决方案:
引用10楼bf234511171的回复:

好长的代码!!看的眼花了!

我晕过去了··
解决方案:
怎么不打包一下呢,太长了

时间: 2024-02-28 00:00:39

Swing 类似百度搜索的效果 求高手帮忙完善一下的相关文章

初学者的忧伤-实现类似百度搜索效果,输入关键字(都是英文),将查出来的内容的关键字标红

问题描述 实现类似百度搜索效果,输入关键字(都是英文),将查出来的内容的关键字标红 我现在需要输入关键字,从数据库查出内容,并在显示时候将关键字标红.(该功能很好实现) 我现在遇到的问题是,我该如何实现替换之后显示的内容和之前数据库中查出的内容关键字位置大小写一致. 附上我写的代码: article.getArticleTitle()是数据库中的字段.search是输入的关键字 article.getArticleTitle().replaceAll("(?i)" + search,

回溯 搜索 数独 pascal 求高手赐教

问题描述 回溯 搜索 数独 pascal 求高手赐教 我的代码 请问那里有问题 答案总是错 谢谢 靶形数独 (sudo.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z博士请教,Z博士拿出了他最近发明的"靶形数独",作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在9格宽×9格高的大九宫格中有9个3格宽×3格高的小九宫格(用粗黑色线隔开的).在

Zend Framework框架实现类似Google搜索分页效果_php实例

本文实例讲述了Zend Framework框架实现类似Google搜索分页效果.分享给大家供大家参考,具体如下: /** * * @param unknown_type $model 表类型 * @param unknown_type $ncontroller 那个控制器提交的controller * @param unknown_type $naction 那个action提交的action */ public function fenyepage2($model,$ncontroller,$

想做个类似百度文库的效果,在后台上传一个文件,使用代码将上传的文件转换为图片,在前台将图片显示在html页面中,有具体的实现代码吗

问题描述 如题:想做个类似百度文库的效果,在后台上传一个文件,使用代码将上传的文件转换为图片,在前台将图片显示在html页面中,有具体的实现代码吗,新人求教 解决方案 解决方案二:该回复于2011-12-19 17:20:03被版主删除解决方案三:可以使用flashprint软件来实现usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Diagnostics;names

html5-【菜鸟问题】两组轮播JS代码有冲突,问题很多!求高手帮忙解决

问题描述 [菜鸟问题]两组轮播JS代码有冲突,问题很多!求高手帮忙解决 上图JS代码如下: [code=javascript] //首页顶部轮播 var i = 0; jummper(); function jummper() { $(".car ul li").eq(i).find("img").css("left", "-100%"); //滑动图在左边-100%准备 $(".car ul li").e

急求高手帮忙,小女感激不尽啊~~

问题描述 已有一个工程,代码什么的都编写好的现成的,但是我不懂得怎么导入eclipse调试和生成~~~急求高手帮忙 解决方案 解决方案二:file-->import-->general->existingprojectintowrokspace解决方案三:在packageexplorer视图里右击点import也可以方法同上面的解决方案四:记得选上copyprojectsintoworkspace其实这个在百度能查到的,问问题前最后多查查...解决方案五:如果初始工程不是eclipse的

linux ext4 格式问题,求高手帮忙,急……

问题描述 linux ext4 格式问题,求高手帮忙,急-- 打包成ext4格式是包如下错,测试需要打包的文件内容几十M时,不出错. 猜想是Linux默认配置参数的问题,百度,Google没找到答案.高手帮忙解决下,急-- ./mkuserimg.sh -s serverlog system7.img.ext4 ext4 1190M in mkuserimg.sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

求高手帮忙数据查询优化

问题描述 在一个页面进行查询,可是好久之后才会显示查询到数据,代码如下:求高手帮忙if(this.lukGroup.EditValue==null){MessageBox.Show("工作中心组必选!");return;}stringsql="";//stringif(this.lukLine.EditValue!=null&&this.lukLine.EditValue.Equals("09")){sql="SELEC

ios-小女子求高手帮忙绘制一个自定义图表

问题描述 小女子求高手帮忙绘制一个自定义图表 小女子刚开始ios编程不久,如今有个画图表的需求,不知道该怎么实现,求高手帮帮忙,下面是需求图C804A51F-3878-4D66-9C49-EF996F790E23.png 解决方案 图都看不见. 刚开始,谁都一样,多练习多查资料,慢慢就会了,一步步来. 先自己想,先把思路列出来,不会的再查,主要是要想弄明白需求是什么,弄不明白,其他的就是会了,在遇到问题,你也想不明白. 这是我的观点,我也是刚学习IOS编程不久,经常蒙圈.多练多敲多想多查就好了.