jComoBox 仅输入字符(无数字)
jComoBox input only characters (no numbers)
我正在尝试制作一个允许除数字以外的所有输入的 jComoBox。但是当我用 jComoBox 尝试它时它不起作用。
我用 jTextFiled 成功地做到了(但相反 - 没有数字):
i_borowjTextFiled 的 TimeKeyTyped 事件代码:
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?
谢谢。
下面是一个示例,说明如何为组合框提供所需的检查。同样的方法也可以用于文本字段(比使用监听器更好)。当用户将文本粘贴到组合框中时,此方法也适用。
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;
}
}
}
我正在尝试制作一个允许除数字以外的所有输入的 jComoBox。但是当我用 jComoBox 尝试它时它不起作用。
我用 jTextFiled 成功地做到了(但相反 - 没有数字):
i_borowjTextFiled 的 TimeKeyTyped 事件代码:
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? 谢谢。
下面是一个示例,说明如何为组合框提供所需的检查。同样的方法也可以用于文本字段(比使用监听器更好)。当用户将文本粘贴到组合框中时,此方法也适用。
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;
}
}
}