2017-08-01 71 views
0

我试图做一个jComoBox,允许除从数字的所有输入。但是,当我用jComoBox尝试它不工作。jComoBox输入的字符(不含数字)

我jTextFiled(但oppsite-没有数字)做到了成功:

TimeKeyTyped的代码事件i_borow jTextFiled:

private void i_borowTimeKeyTyped(java.awt.event.KeyEvent evt) {          
    char c = evt.getKeyChar(); 
    if(!(Character.isDigit(c) || c == KeyEvent.VK_BACK_SPACE || c == KeyEvent.VK_DELETE)) { 
     evt.consume(); 
     l_msg2.setForeground(Color.red); 
    } else { 
     l_msg2.setForeground(Color.black); 
    } 
} 

我试图做同样的jComoBox(c_title) :

private void c_titleKeyTyped(java.awt.event.KeyEvent evt) {         
    System.out.println("ssss"); 
    char c = evt.getKeyChar(); 
    System.out.println(c); 
    if(Character.isDigit(c)){ 
     evt.consume(); 
     l_noNum.setForeground(Color.red); 
    } else { 
     l_noNum.setForeground(Color.black); 
    } 
} 

该代码不起作用。 此外,这不是打印“ssss”字符串。 为什么它不能在jComboBox上工作? 谢谢。

回答

3

下面是一个例子,如何提供你需要的组合框中的检查。你也可以用于文本字段的相同方法(它比使用侦听器更好)。当用户将文本粘贴到组合框中时,这种方法也适用。

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.plaf.basic.BasicComboBoxEditor; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class FilterTryout { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frm = new JFrame("Combo test"); 
       JComboBox<String> combo = new JComboBox<>(new String[] {"One", "Two", "Three"}); 
       combo.setEditor(new ComboEditor()); 
       combo.setEditable(true); 
       frm.add(combo); 
       frm.pack(); 
       frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frm.setLocationRelativeTo(null); 
       frm.setVisible(true); 
      } 
     }); 
    } 

    private static class ComboEditor extends BasicComboBoxEditor { 
     @Override 
     protected JTextField createEditorComponent() { 
      JTextField fld = super.createEditorComponent(); 
      ((AbstractDocument) fld.getDocument()).setDocumentFilter(new NoDigitsFilter()); 
      return fld; 
     } 
    } 

    private static class NoDigitsFilter extends DocumentFilter { 
     @Override 
     public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { 
      if (isNoDigits(string)) { 
       super.insertString(fb, offset, string, attr); 
      } 
     } 

     @Override 
     public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 
      if (isNoDigits(text)) { 
       super.replace(fb, offset, length, text, attrs); 
      } 
     } 

     private boolean isNoDigits(String text) { 
      boolean noDigits = true; 
      for (int i = 0; i < text.length() && noDigits; i++) { 
       noDigits = !Character.isDigit(text.charAt(i)); 
      } 
      return noDigits; 
     } 
    } 
} 
+0

感谢那些作品。但有一个错误:在线程“AWT-EventQueue的 - 0” java.lang.IllegalArgumentException异常异常:倒霉的位置:1 –

+0

@DocLevi对我的作品的罚款。我怎样才能重现这个异常? –

+0

我正在使用:AutoCompleteDecorator.decorate(JComboBox)。也许这是原因? –