问题描述
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的回复:
好长的代码!!看的眼花了!
我晕过去了··
解决方案:
怎么不打包一下呢,太长了