Java 将相关文本显示为JTextfield中的字母

Java 将相关文本显示为JTextfield中的字母,java,Java,我正在用java编写代码,当我在JTextField中输入一些字母时,相关的项目应该从我的数据库中选取,并显示在下拉菜单/列表中。以下是我正在使用的代码,但存在一个问题: package rough2; import java.awt.*; import javafx.scene.input.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; public cl

我正在用java编写代码,当我在JTextField中输入一些字母时,相关的项目应该从我的数据库中选取,并显示在下拉菜单/列表中。以下是我正在使用的代码,但存在一个问题:

    package rough2;

    import java.awt.*;
    import javafx.scene.input.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.*;


    public class Rough2 extends JFrame{


        public static final int MAXITEMS = 100;
        JPanel panel = new JPanel();
        JTextField textField = new JTextField(10);
        String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
        String[] listItems;
        JList theList = new JList();

        public Rough2() {
            this.add(panel);
            panel.setPreferredSize(new Dimension(500, 300));
            panel.add(textField);
            panel.add(theList);

            textField.addKeyListener(new KeyListener() {

                @Override
                public void keyTyped(java.awt.event.KeyEvent e) {
                    String compareString = ("" + textField.getText()+ e.getKeyChar());
                    listItems = new String[MAXITEMS];

                    if (compareString.trim().length() > 0 ){
                        int counter = 0;
                        for (int i = 0; i < myDataBase.length; i++) {
                            if (counter < MAXITEMS) {
                                if (myDataBase[i].length() >= compareString.length() &&
                                        myDataBase[i].substring(0, compareString.length()).equalsIgnoreCase(compareString)) {
                                    listItems[counter] = myDataBase[i];
                                    counter++;
                                }
                            }
                        }
                    }

                    theList.setListData(listItems);
                }

                @Override
                public void keyPressed(java.awt.event.KeyEvent e) {
                }

                @Override
                public void keyReleased(java.awt.event.KeyEvent e) {
                }
            });
        }

    public static void main(String[] args) {
        // TODO code application logic here

        final Rough2 answer = new Rough2();
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                answer.pack();
                answer.setVisible(true);
            }
        });
    }

}
2;
导入java.awt.*;
导入javafx.scene.input.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.*;
公共类2扩展了JFrame{
公共静态最终整数最大项=100;
JPanel面板=新的JPanel();
JTextField textField=新的JTextField(10);
字符串[]myDataBase={“Alice”、“Bob”、“Rose”、“Coggu”、“Alpha”、“david”、“peter”、“max”};
字符串[]列表项;
JList theList=新JList();
公共服务2(){
本条添加(面板);
面板。设置首选尺寸(新尺寸(500300));
panel.add(textField);
面板。添加(列表);
addKeyListener(新的KeyListener(){
@凌驾
public void keyTyped(java.awt.event.KeyEvent e){
字符串比较字符串=(“”+textField.getText()+e.getKeyChar());
listItems=新字符串[MAXITEMS];
如果(compareString.trim().length()>0){
int计数器=0;
for(int i=0;i=compareString.length()&&
myDataBase[i]。子字符串(0,compareString.length())。equalsIgnoreCase(compareString)){
listItems[counter]=myDataBase[i];
计数器++;
}
}
}
}
setListData(列表项);
}
@凌驾
按下public void键(java.awt.event.KeyEvent e){
}
@凌驾
public void keyereleased(java.awt.event.KeyEvent e){
}
});
}
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
最终粗选2答案=新粗选2();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
答案:pack();
回答:setVisible(true);
}
});
}
}
问题是结果显示在列表中,而不是我想要的文本字段下的下拉菜单中

还有一个问题。那就是当我写假设“Al”找到结果时,它会给我“Alice”作为结果,但一旦我从“Al”中删除“l”,它就不会显示任何内容。所有的结果或输出都消失了,或者换句话说,我得到了一个空白列表

请帮我解决这两个问题:

  • 将文本字段下书写的字母的相对结果显示为 在下拉菜单和
  • 即使在我从书面记录中删除一些字母后仍显示结果 上述示例中解释的字母

  • 代码中的两个问题是:

  • 为了在文本字段下显示列表,您应该 使用布局。默认情况下,它们将一个挨着另一个放置 因为有空间
  • 以便在从中删除字符时获得结果 textfield,您应该过滤不可打印的字符(如
    delete
    键),以从比较中排除
  • 请参见下面的代码及其更正:

    public class Rough2 extends JFrame{
        public static final int MAXITEMS = 100;
        JPanel panel = new JPanel(new BorderLayout()); // You should use a layout on the panel for the textfield and the list
        JTextField textField = new JTextField(5);
    
        String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
        String[] listItems;
        JList theList = new JList();
    
        public Rough2() {
            this.add(panel);
            panel.setPreferredSize(new Dimension(500, 300));
            panel.add(textField, BorderLayout.NORTH); // you should add the components using the layout
            panel.add(theList, BorderLayout.WEST); // added using the layout also
    
            textField.addKeyListener(new KeyListener() {
    
                @Override
                public void keyTyped(java.awt.event.KeyEvent e) {
                    char newChar = e.getKeyChar();
    
                    String compareString = "";
                    if (isAsciiPrintable(newChar)) { //you should check if the key that triggered the event is a printable character
                        compareString = ("" + textField.getText() + newChar); // add the character if it's printable
                    }
                    else {
                        compareString = ("" + textField.getText()); // do not add it if it's not printable
                    }
    
                    System.out.println(compareString);
    
                    listItems = new String[MAXITEMS];
    
                    if (compareString.trim().length() > 0 ){
                        int counter = 0;
                        for (int i = 0; i < myDataBase.length; i++) {
                            if (counter < MAXITEMS) {
                                if (myDataBase[i].length() >= compareString.length() &&
                                        myDataBase[i].substring(0, compareString.length()).equalsIgnoreCase(compareString)) {
                                    listItems[counter] = myDataBase[i];
                                    counter++;
                                }
                            }
                        }
                    }
    
                    theList.setListData(listItems);
                }
    
                @Override
                public void keyPressed(java.awt.event.KeyEvent e) {
                }
    
                @Override
                public void keyReleased(java.awt.event.KeyEvent e) {
                }
            });
        }
    
        public static boolean isAsciiPrintable(char ch) {
            return ch >= 32 && ch < 127;
        }
    
        public static void main(String[] args) {
            // TODO code application logic here
    
            final Rough2 answer = new Rough2();
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    answer.pack();
                    answer.setVisible(true);
                }
            });
        }
    }
    

    祝你好运

    是的,这适用于删除字符,但适用于1。我想说的是,我想把相关的单词显示为文本字段中的字母,比如GoogleWorks。当您在搜索字段中写入一些字母时,它会显示相关单词。此外,我不想使用“JList”,因为我想在文本字段下方添加一些组件,如按钮,如果我使用“JList”,它将向左或向右移动这些组件的位置,但我希望它们位于相同的位置,与谷歌搜索字段和按钮的工作原理相同。@MaqsoodAhmad请在您的问题上添加额外的说明。您可以检查这个问题以获得更好的筛选示例:,当然,您可以通过以下
    CustomComboxDemo
    来使用任何面板更新您的下拉条目:是的,我已经看到了链接,但它们是关于JComboBox的,我想使用JTextField进行更新。换句话说,我希望得到与JComboBox相同的结果,如链接()所示,但使用JTextField.@MaqsoodAhmad检查我编辑的答案和我添加的第二个代码示例。干杯。可能是你在寻找自动完成?
    import java.awt.Dimension;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.Arrays;
    import java.util.List;
    
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    public class Rough4 extends JFrame {
        Popup pop;
        JTextField mainTxt;
        List<String> options;
        DefaultListModel model;
        JList l;
        String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
    
    
        Rough4() {
            options = Arrays.asList(myDataBase);
    
            mainTxt = new JTextField();
            mainTxt.setPreferredSize(new Dimension(100,20));
            mainTxt.addKeyListener(new KeyListener() {
    
                @Override
                public void keyTyped(KeyEvent e) {
                    char newChar = e.getKeyChar();
                    if (isAsciiPrintable(newChar)) {
                        csearch(mainTxt.getText()+newChar);
                    }
                    else {
                        csearch(mainTxt.getText());
                    }
                }
    
                @Override
                public void keyPressed(KeyEvent e) {
                }
    
                @Override
                public void keyReleased(KeyEvent e) {
                }
            });
    
    
            JPanel panel = new JPanel();
            panel.add(mainTxt);
    
    
            this.add(panel);
            this.setPreferredSize(new Dimension(500,500));
    
    
            PopupFactory factory= PopupFactory.getSharedInstance();
            int x=200;
            int y=30;
    
            model = new DefaultListModel();
            l = new JList(model);
            l.setOpaque(true);
            l.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent e)
                {
                    if(l.getSelectedIndex()!=-1)
                    {
                        mainTxt.setText((String)l.getSelectedValue());
                    }
                }
            });
            pop = factory.getPopup(mainTxt,l,x+5,y+30);
    
    
            this.pack();
            this.setVisible(true);
        }
    
        public boolean isAsciiPrintable(char ch) {
            return ch >= 32 && ch < 127;
        }
    
        public void csearch(String letter) {
            model.removeAllElements();
            for (String option: options) {
                if (option.toLowerCase().startsWith(letter.toLowerCase())) {
                    model.addElement(option);
                }
            }
    
            l.setModel(model);
    
            pop.show();
        }
    
        public final static void main(String[] args) {
            Rough4 r = new Rough4();
        }
    }