القبض على الضغط على المفاتيح العالمية في جاوة

StackOverflow https://stackoverflow.com/questions/264689

  •  06-07-2019
  •  | 
  •  

سؤال

وهكذا أريد لتحريك حدث (التوقف / إلغاء الإيقاف المؤقت لبعض وسائل الاعلام) كلما يضغط المستخدم على مفتاح المسافة في أي مكان في تطبيق سوينغ بلدي.

وبما أن هناك الكثير من الضوابط والألواح التي يمكن أن يكون التركيز، وليس حقا الممكن إضافة keyevents لهم جميعا (ناهيك الإجمالي).

وهكذا وجدت

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

والذي هو رائع، يمكنك تسجيل بضغطة العالمي قبل معالجات. هناك مشكلة كبيرة على الرغم - سيتم كتابة المساحات في كل وقت في حقول الإدخال، خلايا الجدول، وما إلى ذلك، وبالطبع أنا لا أريد أن تشغيل الحدث وقفة ثم

لذلك فإن أي أفكار؟ ربما هناك طريقة للكشف على الصعيد العالمي سواء يركز المؤشر على شيء يسمح إدخال النص، دون الحاجة للتحقق من خلال قائمة من جميع الضوابط للتحرير (القيء!)؟

هل كانت مفيدة؟

المحلول

وأعتقد أنك أجبت ذلك بنفسك - نعم اعتقد انه يمكن معرفة العنصر الحالي الذي لديه التركيز، وإذا كان هو instanceof فئة الحقل معينة، يمكنك تجاهل الفضاء لأغراض الحدث وقفة. إذا كان طبقات ثقيلة الوطأة، لا تقلق، instanceof هو VERY بسرعة لJVM (وفي أي سبب كنت تتحدث الأحداث على نطاق والبشرية والتي تشكل دهر إلى معالج).

نصائح أخرى

وأنا الصدئة على بلدي سوينغ، ولكن أعتقد أنك يجب أن تحاول تسجيل المستمع العالمي باستخدام <لأ href = "http://java.sun.com/javase/6/docs/api/java/awt/Toolkit هتمل # addAWTEventListener (java.awt.event.AWTEventListener،٪ 20long) "يختلط =" نوفولو noreferrer "> Toolkit.addAWTEventListener مع KEY_EVENT_MASK. يمكنك بعد ذلك تصفية تجهيز AWTEvent بناء على نوعها ومصدرها.

طيب ... حسنا ايم محاولة لتصفية استنادا إلى المصدر. المشكلة هي بلدي كومبوبوكسيس للتحرير ... هم instanceof

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

ومنذ BorderlessTextField هي فئة داخلية خاصة، وعلى ما يبدو غير قادر على القيام الاختيار instanceof ضدها.

والأفكار؟

وتحرير: طيب حتى يعمل هذا ....

 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {

            public boolean postProcessKeyEvent(KeyEvent e) {
                if (e.getID() == KeyEvent.KEY_PRESSED) {
                    Object s = e.getComponent();
                    if (!(s instanceof JTextField) &&
                        !(s instanceof JTable && ((JTable) s).isEditing())
                        ) {
                        music_player.pauseEvent();
                    }

                    //System.out.println(s.getClass().toString());
                }
                return true;
            }
        });

ولها الإجمالي تماما وأنا أكره ذلك.  أتمنى أن يجدوا طريقة للتحقق مما إذا تم استهلاك بضغطة من قبل أي مكون - ثم أتمكن من أداء فقط حالة توقف عندما لم يكن اتخاذ إجراءات بشأن بضغطة من قبل أي عنصر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top