2010-11-26 41 views
0

J'ai une JTable qui démarre l'édition automatiquement lorsque vous appuyez sur une touche. Le texte déjà entré sera également supprimé, de sorte que si vous commencez à taper, seule votre saisie aura la valeur actuelle. Cela fonctionne, mais mon problème est que chaque touche commence cette édition, comme le verrouillage des majuscules, numlock, esc et des trucs comme ça. Comment puis-je exclure toutes les clés de contrôle de cette édition, sans les exclure une par une?Modification d'une entrée de table sur l'événement de clé

Voici le code que j'ai déjà. C'est dans la méthode isCellEditable dans TableCellEditor liée à la table.

// It's a keyevent, so check if it's a key that should start editing 
if (anEvent instanceof KeyEvent) { 

// Get the events key 
int keyCode = ((KeyEvent) anEvent).getKeyCode(); 
char keyChar = ((KeyEvent) anEvent).getKeyChar(); 

// Convert character to lower case by first creating a string out of it 
keyChar = ("" + keyChar).toLowerCase().charAt(0); 

// F2 allowed 
if (keyCode == KeyEvent.VK_F2) { 
    return true; 
} 

// Keycode is unknown so check if we can at least find the keyChar 
if (keyCode == 0 && (keyChar == 'ä' || keyChar == 'ö' || keyChar == 'ü')) { 
    resetText = true; 
    return true; 
} 

// Control characters disallowed 
if (keyCode < 32 || keyCode == KeyEvent.VK_WINDOWS 
     || keyCode == KeyEvent.VK_CONTEXT_MENU || keyCode == KeyEvent.VK_SCROLL_LOCK 
     || keyCode == KeyEvent.VK_NUM_LOCK || keyCode == KeyEvent.VK_META 
     || (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12)) 
    return false; 

// all other keys are allowed 
resetText = true; 
return true; 

}

Répondre

1

Peut-être au lieu de vérifier les faux événements, vous vérifierai pour les positifs:

if (anEvent instanceof KeyEvent) { 
    // Get the events key 
    int keyCode = ((KeyEvent) anEvent).getKeyCode(); 
    char keyChar = ((KeyEvent) anEvent).getKeyChar(); 
    resetText = false; 
    // F2 allowed 
    if (keyCode == KeyEvent.VK_F2) { 
     return true; 
    } 
    // letters, digits and space allowed 
    if (Character.isSpaceChar(keyChar) || Character.isLetterOrDigit(keyChar)) { 
     resetText = true; 
     return true; 
    } 
    return false; 
} 

Vous devrez peut-être prolonger la dernière si liste des caractères spéciaux tels que _ , *, #, etc.

+0

Super, merci. Cela fonctionnera bien. – multiholle

0

Vous pouvez utiliser l'habillage Caractère pour déterminer facilement le type de clé qui a été poussé. Des méthodes comme isLetterOrDigit (int codepoint) seraient probablement utiles.