java - 在 Java 中实现自动完成——我做对了吗?

标签 java swing autocomplete jframe jwindow

<分区>

算法

  1. 开始
  2. 输入城市名称 - 部分或完整
  3. 如果用户点击回车,从 JTextField 中获取文本
  4. 开始强力搜索。
  5. 如果找到匹配项,将它们放入 Vector 并将其放入 JList
  6. 如果没有找到匹配项,在Vector中添加一个String“No Match Found”
  7. 向用户显示包含结果的 JWindow
  8. 停止

代码:

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){

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

输出

enter image description here

问题

显示结果的 JWindow 的大小(它是 JScrollPane 中的 JList)根据结果而变化 - 如果城市name小,JWindow小,城市名大,JWindow大。

我已经尝试了所有可能的组合。我尝试使用 JWindowJListJScrollPanesetPreferredDimension() 但问题不会解决。
我希望它与装饰的 JFrame 的大小相匹配,无论如何

最佳答案

编辑

Anyways so basically I will have to manually create a list of all the cities that are to be supported right ?? bx @Little Child

  • 这个想法可能很简单,你可以把JTable to the JWindow

  • 有一个

  • 没有JTableHeader

  • 在那里添加RowSorter (参见教程中的代码示例)

  • 然后每个步骤都完成 :-),那里不需要其他任何东西(在 RowFilter 的情况下,可能会更改 JTextFieldBackground 没有返回匹配项,为 DocumentListener 的弹出窗口添加 setVisible(一定要测试 !isVisible))

关于java - 在 Java 中实现自动完成——我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14849176/

相关文章:

angularjs - 使用 typeahead 和 Angularjs 像 Outlook 一样自动完成

java - 从未调用过 AlertDialog setOnShowListener

java - Hadoop <init> 没有这样的方法异常

java - JMenu 重复

java - JTextPane 和键盘输入

c# - 在 C# 中自动完成文本框

.net - 自动完成 jQuery 1.8-UI JSON 格式

java - 在 FlowLayout 中设置 JLabel 的大小

Java将Json字符串转为数组

Java2D距离碰撞检测