自动建议组合框

Auto-suggestion ComboBox

我有一个 JComboBox 并且 JComboBox 有很多项。我想在 JComboBox 上添加“自动建议”功能。

像这样:我有 3 个项目,“Artpop”、“Born This Way”和“Chromatica”。如果我键入“Way”,那么自动完成会选择“Born This Way”项。如果我键入“matica”,那么自动完成会选择“Chromatica”项。

我在 Whosebug 上寻找它,但所有答案都已过时(我使用的是 Swing,而答案是针对 AWT 的。当我做答案时,我有几个错误)。

Swing JComboBox如何制作自动提示?

需要一个 JTextField 和一个 JComboBox 来创建一个 auto-suggestion 组合框。

这是我整理的一个例子。不幸的是,GUI 图片没有正确显示 JComboBox。

我用 JTextFieldJComboBox 创建了一个简单的 GUI。

当您在 JTextField 中键入一个字符时,JComboBox 选项将缩减为包含该字符的 Strings。搜索不区分大小写。如果您键入 w,它将 return 所有 StringswW .

这是我使用的完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class AutoSuggestionExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new AutoSuggestionExample());
    }
    
    private DefaultComboBoxModel<String> comboBoxModel;
    
    private JTextField autoSuggestionField;
    
    private List<String> masterList;
    
    public AutoSuggestionExample() {
        String[] masterList = { "Artpop", "Born This Way", "Chromatica" };
        this.masterList = Arrays.asList(masterList);
        this.comboBoxModel = new DefaultComboBoxModel<>(masterList);
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Auto Suggestion Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        
        autoSuggestionField = new JTextField(20);
        autoSuggestionField.addKeyListener(new AutoSuggestionListener());
        panel.add(autoSuggestionField);
        
        JComboBox<String> comboBox = new JComboBox<>(comboBoxModel);
        comboBox.setSelectedIndex(0);
        panel.add(comboBox);
        
        return panel;
    }
    
    public List<String> createSelectedList(String search) {
        if (search.isEmpty()) {
            return masterList;
        }
        
        search = search.toLowerCase();
        List<String> selectedList = new ArrayList<>();
        for (String s : masterList) {
            if (s.toLowerCase().contains(search)) {
                selectedList.add(s);
            }
        }
        
        return selectedList;
    }
    
    public void updateComboBox(List<String> selectedList) {
        comboBoxModel.removeAllElements();
        comboBoxModel.addAll(selectedList);
        if (selectedList.size() > 0) {
            comboBoxModel.setSelectedItem(selectedList.get(0));
        }
    }
    
    public class AutoSuggestionListener extends KeyAdapter {

        @Override
        public void keyPressed(KeyEvent event) {
            String text = autoSuggestionField.getText() + event.getKeyChar();
            updateComboBox(createSelectedList(text));
        }

    }

}

正如 Andrew Thompson 评论的那样:“当组合框处于焦点状态并且用户键入其中包含的项目的前几个字母时,该项目将被选中”
此行为在 public 方法 JComboBox.selectWithKeyChar(char keyChar) 中定义。 您可以扩展 JComboBox 来覆盖 selectWithKeyChar(char keyChar) 以定义不同的行为。