Java 如何制作一个可编辑的SWT组合,允许用户只键入组合中的项目

Java 如何制作一个可编辑的SWT组合,允许用户只键入组合中的项目,java,swt,jface,Java,Swt,Jface,我有一个SWTCombo,其中一些字符串列表被设置为Combo的项 组合应可编辑,以便: 当用户输入一个不存在的项目时,不允许它键入和 当用户输入现有项时,它应该根据键入的每个键进行提示 请告诉我您对如何实现这一目标的建议?我在这里找到了一个例子: 我稍微修改了它,以便在未找到匹配项时清除组合: private static String[] items = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Frid

我有一个SWT
Combo
,其中一些字符串列表被设置为
Combo
的项

组合应可编辑,以便:

  • 当用户输入一个不存在的项目时,不允许它键入和
  • 当用户输入现有项时,它应该根据键入的每个键进行提示

  • 请告诉我您对如何实现这一目标的建议?

    我在这里找到了一个例子:

    我稍微修改了它,以便在未找到匹配项时清除
    组合:

    private static String[] items   = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
    
    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("StackOverflow");
        shell.setLayout(new FillLayout());
    
        Combo combo = new Combo(shell, SWT.BORDER);
        for (int i = 0; i < items.length; i++)
        {
            combo.add(items[i]);
        }
    
        addAutoCompleteFeature(combo);
    
        shell.pack();
        shell.open();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        display.dispose();
    }
    
    public static void addAutoCompleteFeature(Combo combo)
    {
        // Add a key listener
        combo.addKeyListener(new KeyAdapter()
        {
            public void keyReleased(KeyEvent keyEvent)
            {
                Combo cmb = ((Combo) keyEvent.getSource());
                setClosestMatch(cmb);
            }
    
            // Move the highlight back by one character for backspace
            public void keyPressed(KeyEvent keyEvent)
            {
                if (keyEvent.keyCode == SWT.BS)
                {
                    Combo cmb = ((Combo) keyEvent.getSource());
                    Point pt = cmb.getSelection();
                    cmb.setSelection(new Point(Math.max(0, pt.x - 1), pt.y));
                }
            }
    
            private void setClosestMatch(Combo combo)
            {
                String str = combo.getText();
                String[] cItems = combo.getItems();
                // Find Item in Combo Items. If full match returns index
                int index = -1;
                for (int i = 0; i < cItems.length; i++)
                {
                    if (cItems[i].toLowerCase().startsWith(str.toLowerCase()))
                    {
                        index = i;
                        break;
                    }
                }
    
                if (index != -1)
                {
                    Point pt = combo.getSelection();
                    combo.select(index);
                    combo.setText(cItems[index]);
                    combo.setSelection(new Point(pt.x, cItems[index].length()));
                }
                else
                {
                    combo.setText("");
                }
            }
        });
    }
    
    private static String[]items=新字符串[]{“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”};
    公共静态void main(字符串[]args)
    {
    显示=新显示();
    外壳=新外壳(显示);
    shell.setText(“StackOverflow”);
    setLayout(新的FillLayout());
    组合组合=新组合(shell,SWT.BORDER);
    对于(int i=0;i
    我在这里找到了一个例子:

    我稍微修改了它,以便在未找到匹配项时清除
    组合:

    private static String[] items   = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
    
    public static void main(String[] args)
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("StackOverflow");
        shell.setLayout(new FillLayout());
    
        Combo combo = new Combo(shell, SWT.BORDER);
        for (int i = 0; i < items.length; i++)
        {
            combo.add(items[i]);
        }
    
        addAutoCompleteFeature(combo);
    
        shell.pack();
        shell.open();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        display.dispose();
    }
    
    public static void addAutoCompleteFeature(Combo combo)
    {
        // Add a key listener
        combo.addKeyListener(new KeyAdapter()
        {
            public void keyReleased(KeyEvent keyEvent)
            {
                Combo cmb = ((Combo) keyEvent.getSource());
                setClosestMatch(cmb);
            }
    
            // Move the highlight back by one character for backspace
            public void keyPressed(KeyEvent keyEvent)
            {
                if (keyEvent.keyCode == SWT.BS)
                {
                    Combo cmb = ((Combo) keyEvent.getSource());
                    Point pt = cmb.getSelection();
                    cmb.setSelection(new Point(Math.max(0, pt.x - 1), pt.y));
                }
            }
    
            private void setClosestMatch(Combo combo)
            {
                String str = combo.getText();
                String[] cItems = combo.getItems();
                // Find Item in Combo Items. If full match returns index
                int index = -1;
                for (int i = 0; i < cItems.length; i++)
                {
                    if (cItems[i].toLowerCase().startsWith(str.toLowerCase()))
                    {
                        index = i;
                        break;
                    }
                }
    
                if (index != -1)
                {
                    Point pt = combo.getSelection();
                    combo.select(index);
                    combo.setText(cItems[index]);
                    combo.setSelection(new Point(pt.x, cItems[index].length()));
                }
                else
                {
                    combo.setText("");
                }
            }
        });
    }
    
    private static String[]items=新字符串[]{“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”};
    公共静态void main(字符串[]args)
    {
    显示=新显示();
    外壳=新外壳(显示);
    shell.setText(“StackOverflow”);
    setLayout(新的FillLayout());
    组合组合=新组合(shell,SWT.BORDER);
    对于(int i=0;i