تغيير إدخال الجدول في الحدث الرئيسي
-
28-09-2019 - |
سؤال
لديّ Jtable يبدأ التحرير تلقائيًا عند الضغط على المفتاح. سيتم أيضًا حذف النص الذي تم إدخاله بالفعل ، بحيث إذا بدأت في كتابة الكتابة فقط ، فحصل على القيمة الحالية. هذا يعمل ، لكن مشكلتي هي أن كل مفتاح يبدأ هذا التحرير ، مثل Capslock و Numlock و ESC وأشياء من هذا القبيل. كيف يمكنني استبعاد كل أنواع مفاتيح التحكم من هذا التحرير ، دون استبعاد واحد تلو الآخر؟
إليك الرمز الذي لدي بالفعل. إنه في الطريقة القابلة للعلاج في tablecelleditor المتعلقة بالجدول.
// 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;
}
المحلول
ربما بدلاً من التحقق من الأحداث الخاطئة ، يجب عليك التحقق من الحالات الإيجابية:
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;
}
قد تحتاج إلى تمديد آخر إذا قائمة مع chars خاصة مثل _ ، *، #، إلخ.
نصائح أخرى
يمكنك استخدام غلاف الأحرف لتحديد نوع المفتاح الذي تم دفعه بسهولة. من المحتمل أن تكون طرق مثل IsletterorDigit (int codepoint) مفيدة.