Java jComoBox仅输入字符(无数字)
我正在尝试制作一个jComoBox,它允许除了数字以外的所有输入。但当我用jComoBox尝试时,它不起作用 我用jtextfield成功地做到了这一点(但对方-没有数字): i_borow JTextfield的TimeKeyTyped事件代码:Java jComoBox仅输入字符(无数字),java,swing,jcombobox,Java,Swing,Jcombobox,我正在尝试制作一个jComoBox,它允许除了数字以外的所有输入。但当我用jComoBox尝试时,它不起作用 我用jtextfield成功地做到了这一点(但对方-没有数字): i_borow JTextfield的TimeKeyTyped事件代码: private void i_borowTimeKeyTyped(java.awt.event.KeyEvent evt) { char c = evt.getKeyC
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_标题)做同样的操作:
代码不起作用。
此外,这不是打印“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;
}
}
}
import javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.WindowConstants;
导入javax.swing.plaf.basic.BasicComboxeditor;
导入javax.swing.text.AbstractDocument;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DocumentFilter;
公共类筛选{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame frm=新JFrame(“组合测试”);
JComboBox组合=新的JComboBox(新字符串[]{“一”、“二”、“三”});
setEditor(新的ComboEditor());
combo.setEditable(真);
frm.添加(组合);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(空);
frm.setVisible(真);
}
});
}
私有静态类ComboEditor扩展了BasicComboxeditor{
@凌驾
受保护的JTextField createEditorComponent(){
JTextField fld=super.createEditorComponent();
((AbstractDocument)fld.getDocument()).setDocumentFilter(新的NoDigitsFilter());
返回fld;
}
}
私有静态类NoDigitsFilter扩展了DocumentFilter{
@凌驾
public void insertString(FilterBypass fb,int offset,String String,AttributeSet attr)引发BadLocationException{
if(isNoDigits(字符串)){
super.insertString(fb,offset,string,attr);
}
}
@凌驾
public void replace(FilterBypass fb、int offset、int length、字符串文本、AttributeSet attrs)引发BadLocationException{
如果(isNoDigits(文本)){
super.replace(fb、偏移量、长度、文本、属性);
}
}
私有布尔值isNoDigits(字符串文本){
布尔noDigits=true;
对于(int i=0;i
下面是一个示例,说明如何为组合框提供所需的复选框。同样的方法也可以用于文本字段(比使用侦听器更好)。当用户将文本粘贴到组合框中时,这种方法也有效
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;
}
}
}
import javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.WindowConstants;
导入javax.swing.plaf.basic.BasicComboxeditor;
导入javax.swing.text.AbstractDocument;
导入javax.swing.text.AttributeSet;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.DocumentFilter;
公共类筛选{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame frm=新JFrame(“组合测试”);
JComboBox组合=新的JComboBox(新字符串[]{“一”、“二”、“三”});
setEditor(新的ComboEditor());
combo.setEditable(真);
frm.添加(组合);
frm.pack();
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(空);
frm.setVisible(真);
}
});
}
私有静态类ComboEditor扩展了BasicComboxeditor{
@凌驾
受保护的JTextField createEditorComponent(){
JTextField fld=super.createEditorComponent();
((AbstractDocument)fld.getDocument()).setDocumentFilter(新的NoDigitsFilter());
返回fld;
}
}
私有静态类NoDigitsFilter扩展了DocumentFilter{
@凌驾
public void insertString(FilterBypass fb,int offset,String String,AttributeSet attr)引发BadLocationException{
if(isNoDigits(字符串)){
super.insertString(fb,offset,string,attr);
}
}
@凌驾
public void replace(FilterBypass fb、int offset、int length、字符串文本、AttributeSet attrs)引发BadLocationException{
如果(isNoDigits(文本)){
super.replace(fb、偏移量、长度、文本、属性);
}
}
私有布尔值isNoDigits(字符串文本){
布尔noDigits=true;
对于(int i=0;i
谢谢,这很有效。但有一个错误:线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中的异常:错误位置:1@DocLevi对我来说很好。如何复制此异常?我也在使用:AutoCompleteDecorator.decoration(JComboBox)。也许这就是原因?@DocLevi试着在没有你的装饰师的情况下做这件事。也许这种方法对这个装饰师不起作用。谢谢,这很有效。但有一个错误:线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中存在异常: