如何在JComboBox.java中修改selectWithKeyChar()的函数?

时间:2017-09-06 00:17:34

标签: java swing netbeans combobox

我有一个组合框,其中包含以特殊字符开头的项目(即À)。

目前,在使用组合框时,如果按一个键(即“a”),它会选择以相同的第一个字母开头的项目 - 但它不会选择以特殊字符开头的项目..

有没有办法修改JComboBox.java中的方法selectWithKeyChar()来忽略特殊字符并将其视为常规字符?

我想到的解决方案但不知道如何实施:

1)传入一个临时的组合框模型,选择不包含重音的WithKeyChar()。如果可以的话,如何将模型传递给selectWithKeyChar()?

2)覆盖selectWithKeyChar()方法?

3)制作自定义方法。在这种情况下,您将如何使其运行而不是JComboBox.java中已存在的那个?

以下是我的设置的最小示例:

  • 创建新项目
  • 创建一个具有JPanel表单文件类型
  • 的新文件
  • 添加一个包含以下项目的组合框:“Àpplebee”,“Test”,“Able”
  • 在主要内容中调用JPanel:

       SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(new B());
                frame.pack();
                frame.setVisible(true);
            }
        });
    

1 个答案:

答案 0 :(得分:0)

  

1)传入一个临时的组合框模型,选择WithWeyKeyChar()即可   不包括口音。如果这是可能的,你如何传入   模型选择WithKeyChar()?

     

2)覆盖selectWithKeyChar()方法?

     

3)制作自定义方法。在这种情况下,你将如何让它运行   而不是JComboBox.java中已经存在的那个?

所有这些都是可能的,您可以创建temp ComoBoxModel extends JComboBox来覆盖selectWithKeyCharacter上的CustomComboBox。以下是代码示例:

<强> CustomComboBox.java

public class CustomComboBox extends JComboBox<String>{

private static final long serialVersionUID = 1L;

public CustomComboBox(String[] items) {
    super(items);
}

@Override
public boolean selectWithKeyChar(char keyChar) {
    int index;

    ComboBoxModel<String> tempModel = getModel(); // Put the model on temp variable for saving it for later use.

    String[] itemsArr = new String[getModel().getSize()];
    for(int i = 0; i < getModel().getSize(); i++) {
        // This will normalizes the Strings
        String normalize = Normalizer.normalize(getModel().getElementAt(i), Normalizer.Form.NFD); 
        normalize = normalize.replaceAll("\\p{M}", "");
        itemsArr[i] = normalize;
    }

    if ( keySelectionManager == null )
        keySelectionManager = createDefaultKeySelectionManager();

    setModel(new DefaultComboBoxModel<String>(itemsArr)); // Set the Temporary items to be checked.
    index = keySelectionManager.selectionForKey(keyChar,getModel());
    setModel(tempModel); // Set back the original items.

    System.out.println(index);
    if ( index != -1 ) {
        setSelectedIndex(index);
        return true;
    }
    else
        return false;
}
}

如果你要测试它,即使你输入一个普通的字符'a',它也会选择带有重音或非重音的JComboBox中的元素。

<强> TestMain.java

public class TestMain {
public static void main(String[] args) {
    String[] lists = {"ápa","Zabra","Prime"};
    CustomComboBox combo = new CustomComboBox(lists);
    System.out.println(combo.selectWithKeyChar('A'));

    JFrame frame = new JFrame("Sample");
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(null);
    frame.setVisible(true);
    combo.setSize(70, 30);
    combo.setLocation(100, 100);
    frame.add(combo);
}
}