我正在一个项目中工作,我必须使用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();
}
}
} );
那么,如何通过键入除数字之外的其他字符来阻止用户?
感谢。
答案 0 :(得分:5)
您可以通过TableCellEditor教程的Using an Editor to Validate User-Entered Text部分中所述提供适当的How to Use Tables来实现此目标。
关键是使用JFormattedTextfield作为编辑器NumberFormatter和NumberFormat。例如:
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