浏览器的Swing地址栏

浏览器的Swing地址栏一般带有输入网址的记忆功能,输入首字母,就会出现以它开头的所有曾使用记录。在swing中也能很容易的实现这个功能。

对于这个功能,可以分解成几个步骤:输入-->响应并弹出提示-->选择或继续输入。为防止重复的保存,直接用Set保存所有输入。显示提示的组件可以用JList外面套上1个JWindow.再加上鼠标响应和输入响应,基本就完成了。

用户的所有输入由addCompletion()方法加入到Set中去,这个动作可以由CompletableJTextField上触发Enter快捷键响应,或者由其他的自定义动作实现,取决于你的需求。用户无论输入或者删除一个字母,后台都会根据输入匹配Set中保存的数据,然后将所有匹配条目放到 Jlist中由JWindow显示出来。

如果要看起来更好看,可以在JWindow上setBorder(xx),比如设置一个带阴影层次效果的setBorder(roundedShadowBorder);

如果要更精细一些,可考虑为JList添加上移、下移和回车事件响应,这样就跟浏览器的Swing地址栏完全一样了。

 
 
 
  1. publicclassCompletableJTextFieldextendsJTextFieldimplements
  2. ListSelectionListener{
  3. privatestaticfinallongserialVersionUID=1L;
  4. JListcompletionList;
  5. DefaultListModelcompletionListModel;
  6. JScrollPanelistScroller;
  7. JWindowlistWindow;
  8. Setcompletions;
  9. publicCompletableJTextField(intcol){
  10. super(col);
  11. getDocument().addDocumentListener(newCompleter());
  12. completionListModel=newDefaultListModel();
  13. completionList=newJList(completionListModel);
  14. completionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  15. completionList.addListSelectionListener(this);
  16. listScroller=newJScrollPane(completionList,
  17. ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
  18. ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  19. listWindow=newJWindow();
  20. listWindow.getContentPane().add(listScroller);
  21. }
  22. publicvoidaddCompletion(Strings){
  23. completions.add(s);
  24. }
  25. publicvoidremoveCompletion(Strings){
  26. completions.remove(s);
  27. }
  28. publicvoidclearCompletions(){
  29. completions.clear();
  30. listWindow.setVisible(false);
  31. }
  32. publicvoidvalueChanged(ListSelectionEvente){
  33. if(completionList.getModel().getSize()==0){
  34. return;
  35. }
  36. listWindow.setVisible(false);
  37. finalStringcompletionString=(String)completionList
  38. .getSelectedValue();
  39. SwingUtilities.invokeLater(newRunnable(){
  40. publicvoidrun(){
  41. if(null!=completionString){
  42. setText(completionString);
  43. }
  44. }});
  45. }
  46. /**
  47. *@returnthecompletions
  48. */
  49. publicSetgetCompletions(){
  50. returncompletions;
  51. }
  52. /**
  53. *@paramcompletionsthecompletionstoset
  54. */
  55. publicvoidsetCompletions(Setcompletions){
  56. this.completions=completions;
  57. }
  58. classCompleterimplementsDocumentListener{
  59. privatePatternpattern;
  60. privatevoidbuildPopup(){
  61. completionListModel.clear();
  62. Iteratorit=completions.iterator();
  63. pattern=Pattern.compile(getText()+".+");
  64. while(it.hasNext()){
  65. Stringcompletion=it.next();
  66. Matchermatcher=pattern.matcher(completion);
  67. if(matcher.matches()){
  68. completionListModel.add(completionListModel.getSize(),
  69. completion);
  70. }
  71. }
  72. }
  73. privatevoidshowPopup(){
  74. if(completionListModel.getSize()==0){
  75. listWindow.setVisible(false);
  76. return;
  77. }
  78. Pointlos=getLocationOnScreen();
  79. intpopX=los.x;
  80. intpopY=los.y+getHeight();
  81. listWindow.setLocation(popX,popY);
  82. listWindow.pack();
  83. listWindow.setVisible(true);
  84. }
  85. privatevoidbuildAndShowPopup(){
  86. if(getText().length()<1)
  87. return;
  88. buildPopup();
  89. showPopup();
  90. }
  91. publicvoidinsertUpdate(DocumentEvente){
  92. buildAndShowPopup();
  93. }
  94. publicvoidremoveUpdate(DocumentEvente){
  95. buildAndShowPopup();
  96. }
  97. publicvoidchangedUpdate(DocumentEvente){
  98. buildAndShowPopup();
  99. }
  100. }
  101. }

以上是介绍浏览器的Swing地址栏,希望对大家有用。

当前文章:浏览器的Swing地址栏
网页链接:http://www.shufengxianlan.com/qtweb/news26/371226.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联