当前位置: 首页 > 知识库问答 >
问题:

用Java实现自动完成-我做得对吗?[副本]

蓝鸿哲
2023-03-14
  1. 开始
  2. 输入城市名称-部分或完整
  3. 如果用户点击enter,则从JTextField
  4. 获取文本
  5. 开始暴力搜索。
  6. 如果找到匹配项,则将它们放入矢量中,并将其放入JList
  7. 如果未找到匹配项,请在向量
  8. 添加 字符串“未找到匹配项”
  9. 向包含结果的用户显示JWindow
  10. 停止
package test;
import javax.swing.*;

import java.awt.Dimension;
import java.awt.event.*;
import java.util.Vector;

public class AutoCompleteTest extends JFrame{
    JTextField city = new JTextField(10);
    String enteredName = null;
    String[] cities = {"new jersey","new hampshire",
            "sussex","essex","london","delhi","new york"};
    JList list = new JList();
    JScrollPane pane = new JScrollPane();
    ResultWindow r = new ResultWindow();
//------------------------------------------------------------------------------
    public static void main(String[] args) {
        new AutoCompleteTest();
    }
//------------------------------------------------------------------------------
    public AutoCompleteTest(){
        setLayout(new java.awt.FlowLayout());
        setVisible(true);
        add(city);
//      add(pane);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        city.addKeyListener(new TextHandler());
    }
//------------------------------------------------------------------------------
    public void initiateSearch(String lookFor){
        Vector<String> matches = new Vector<>();
        lookFor = lookFor.toLowerCase();
        for(String each : cities){
            if(each.contains(lookFor)){
                matches.add(each);
                System.out.println("Match: " + each);
            }
        }
        this.repaint();

        if(matches.size()!=0){
            list.setListData(matches);
            r.searchResult = list;
            r.pane = pane;
            r.initiateDisplay();
        }else{
            matches.add("No Match Found");
            list.setListData(matches);
            r.searchResult = list;
            r.pane = pane;
            r.initiateDisplay();
        }

    }
//------------------------------------------------------------------------------
    public class ResultWindow extends JWindow{
        public JScrollPane pane;
        public JList searchResult;
//------------------------------------------------------------------------------
        public ResultWindow(){

        }
//------------------------------------------------------------------------------
        public void initiateDisplay(){
            pane.setViewportView(searchResult);
            add(pane);
            pack();
            this.setLocation(AutoCompleteTest.this.getX() + 2, 
                    AutoCompleteTest.this.getY()+
                    AutoCompleteTest.this.getHeight());

//          this.setPreferredSize(city.getPreferredSize());
            this.setVisible(true);
        }
    }
//------------------------------------------------------------------------------

    class TextHandler implements KeyListener{
        @Override
        public void keyTyped(KeyEvent e){

        }

        @Override
        public void keyPressed(KeyEvent e){
            if(r.isVisible()){
                r.setVisible(false);
            }
            if(e.getKeyChar() == '\n'){
                initiateSearch(city.getText());
            }
        }

        @Override
        public void keyReleased(KeyEvent e){

        }
    }
//------------------------------------------------------------------------------
}

显示结果的JWindows的大小(它是JScrollPane中的JList)根据结果而改变--如果城市名称小,JWindows就小,如果城市名称大,JWindows就大。

我试过所有可能的组合。我尝试使用JWindowsJListJScrollPaneSetPreferredDimension(),但问题不会解决。
无论如何,我都希望它与修饰的JFrame的大小匹配

共有1个答案

沙富
2023-03-14

>

  • JListJComboBox没有返回正确的PreferredSize。必须设置此值,将JList.SetPrototypeCellValue()与JWindowPack()一起使用(任何更改后必须打包)和或与Jlist.SetVisibleRowCount(),然后value将JListJScrollPane中的

    不要使用KeyListener,请使用DocumentListener(可以从系统剪贴板插入字符)用于JTextComponents

    不要重新发明轮子,使用AutoComplete JComboBox/JTextField,您可以将匹配的结果重定向/返回到弹出窗口JWindow/undariedJDialog/code>(这是弹出窗口回收的最佳解决方法)

    编辑

    不管怎样,所以基本上我将不得不手动创建一个列表的所有城市是要支持的,对吗??bx@小孩

    不带JTableHeader

    添加行排序器(请参阅教程中的代码示例)

    然后每一步都完成了:-),这里不需要任何其他东西(如果rowfilter返回不匹配项,那么更改jTextFieldbackground就可以了,从DocumentListener中为弹出窗口添加setVisible(确保测试!isVisible)

  •  类似资料:
    • 我想实现一个自动完成功能。目前我有一个包含JTextField的JPanel,当用户开始键入时,会出现一个包含几个选项的autocomplete(JPopupMenu)。 问题是它占用了文本字段的焦点,用户无法再键入。当我将焦点返回到文本字段时,用户不再有选项之间的导航(使用向上和向下按钮)。此外,对菜单的焦点不允许我截取它的KeyListener(不知道为什么),并且当我尝试处理文本字段端的输入

    • 本文向大家介绍jQuery实现用户输入自动完成功能,包括了jQuery实现用户输入自动完成功能的使用技巧和注意事项,需要的朋友参考一下 利用jQuery UI中Auto-complete插件实现输入自动完成功能,大家在使用诸如淘宝、京东等电商平台搜索商品时,往往只要输入商品的一些特殊字符,就可以显示出和该字符相近的列表菜单,用户使用鼠标或者键盘方向键就可以快速选择,实现了很好的用户体验。 1.最简

    • 本文向大家介绍自动完成的搜索框javascript实现,包括了自动完成的搜索框javascript实现的使用技巧和注意事项,需要的朋友参考一下 在很多需要搜索的网站, 都会有一个自动完成的搜索框. 方便用户查找他们想要的搜索词. 帮助用户快速找到自己想要的结果. 这种方式是比较友好的. 所以是比较提倡使用的. 我们这次就来实现这一效果. 我们通过两篇文章来进行讲解. 首先我们来完成界面的设计布局.

    • 问题内容: 我有一个测试用例,需要在基于ajax的文本字段中输入部分值,并验证列表是否具有预期的内容。如果是这样,请选择内容。任何想法如何使这项工作? 问题答案: 该 类型 命令可能不足以触发自动完成功能。否则,Dave Webb的建议就会出现。我唯一的补充是您可能需要 typeKeys 命令,这会导致触发略有不同的JavaScript事件,这更有可能触发自动完成小部件。

    • 使用AWS ACM证书颁发机构,我已按照此步骤为下属CA创建了CSR。 我还需要签署CSR(如下所述): 目前,我们没有任何架构体系来使用根CA的私钥签署CSR。我们目前有根CA从委托。 目标是使用ACMSDK自动化此签名请求 如何进一步使用此根CA的私钥签署CSR?