如何防止在JTable单元格中输入除数字之外的字符?

时间:2014-01-16 15:09:23

标签: java swing validation jtable keylistener

我正在一个项目中工作,我必须使用JTable从用户那里获得输入。在这里,我创建了一个只有数值的JTable。我在keyTyped上验证了它并且工作正常,直到我按F2或单击单元格。当我这样做时,它将光标放在单元格中,其他字符也被输入。

jtblValues.addKeyListener(new KeyListener() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode()==KeyEvent.VK_ENTER && (jtblValues.getRowCount() == (jtblValues.getSelectedRow()+1))) 
                model.addRow(new Object[]{"", "", ""}); 
            else if (e.getKeyCode()==KeyEvent.VK_TAB && (jtblValues.getRowCount() == (jtblValues.getSelectedRow()+1)) && (jtblValues.getColumnCount() == (jtblValues.getSelectedColumn()+1)))
                model.addRow(new Object[]{"", "", ""}); 
        }
        public void keyReleased(KeyEvent e) {}
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar();
            if (!((c >= '0') && (c <= '9') || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE) || (c == KeyEvent.VK_ENTER) || (c == KeyEvent.VK_TAB))) {
                getToolkit().beep();
                e.consume();
            }
        } 
    } );

那么,如何通过键入除数字之外的其他字符来阻止用户?

感谢。

3 个答案:

答案 0 :(得分:5)

您可以通过TableCellEditor教程的Using an Editor to Validate User-Entered Text部分中所述提供适当的How to Use Tables来实现此目标。

关键是使用JFormattedTextfield作为编辑器NumberFormatterNumberFormat。例如:

NumberFormat integerFormat = NumberFormat.getIntegerInstance();
NumberFormatter formatter = new NumberFormatter(integerFormat);
formatter.setAllowsInvalid(false);
JFormattedTextField textfield = new JFormattedTextField(formatter);

有关详细信息,请参阅How to Use Formatted Text Fields教程。

题外话

当您使用Swing时,最好使用Keybinding over KeyListeners,原因是本主题中讨论的原因:Key bindings vs. key listeners in Java。请参阅教程以KeyBinding开头:How to Use Key Bindings

答案 1 :(得分:0)

也许我和你一样有同样的问题。这段代码使用KeyListener为我工作。

//define KeyAdapter variable at header
KeyAdapter key1, key2;

使类TableEditor像这样:

final class TableEditor extends DefaultCellEditor{

    public TableEditor(){
        super(new JTextField());
        setClickCountToStart(1);
    }

    @Override
    public Component getTableCellEditorComponent(final JTable table,Object value,boolean isSelected,final int row,final int column){
        final JTextField cellEdit = (JTextField) super.getTableCellEditorComponent(table,value,isSelected,row,column);
        cellEdit.setText((String)value);
        table.setSurrendersFocusOnKeystroke(true);

        //remove previous keyListener that store in memory
        cellEdit.removeKeyListener(key1);
        cellEdit.removeKeyListener(key2);

        // KeyAdapter that accept numeric only (key1)
        key1 = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent evt){
                // just for check how much times Enter keyEvent store in memory
                if(evt.getKeyCode()==KeyEvent.VK_ENTER) System.out.println("enter 2"); 
            }
            @Override
            public void keyReleased(KeyEvent evt){

            }
            @Override
            public void keyTyped(KeyEvent evt){
                char c = evt.getKeyChar();
                if (!Character.isDigit(c)) evt.consume();
            }
        };

        // KeyAdapter that accept all char (key2)
        key2 = new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent evt){
                // just for check how much times Enter keyEvent store in memory
                if(evt.getKeyCode()==KeyEvent.VK_ENTER) System.out.println("enter 2"); 
            }
            @Override
            public void keyReleased(KeyEvent evt){

            }
            @Override
            public void keyTyped(KeyEvent evt){

            }
        };
        // cell column 3rd accept numeric only > addKeyListener(key1)
        if (column == 3) {
            cellEdit.addKeyListener(key1);
            cellEdit.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
            cellEdit.setCaretPosition(1);
            return cellEdit;
        } 
        // other cell accept all char > addKeyListener(key2)
        else  {
            cellEdit.addKeyListener(key2);
            cellEdit.setHorizontalAlignment(javax.swing.JTextField.LEFT);
            return cellEdit;
        }
    } 
}

然后使用:

调用该类
MyTable.setDefaultEditor(Object.class, new TableEditor());

这就是全部。我希望这段代码适合你。

答案 2 :(得分:0)

您可以在netbeans中执行以下简单方法: Step 1: see image 1 here Step 2: see image 2 here Step 3: see image 3 here