كيف يمكنني تعيين أدخل كمفتاح الزناد جميع JButtons في تطبيق جافا الخاص بي؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

وأنا أكتب تطبيق سوينغ جافا باستخدام المعادن نظرة وإحساس. في كل مرة كان هناك JButton في طلبي كان المستخدم يستخدم المفتاح Tab لنقل التركيز إلى الزر ثم يضرب على مفتاح Enter. لا يحدث شيء! اذا كان يضرب مفتاح الفضاء وتطلق الأحداث زر. كيف يمكنني تعيين مفتاح Enter لتحريك الأحداث نفسها كمفتاح الفضاء؟ شكرا لكم على مساعدتكم.

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

المحلول

ولقد وجدت ما يلي:

http://tips4java.wordpress.com/2008 / 10/25 / إدخال المفتاح وزر /

وأين يكتب روب Camick أنه عند استخدام JDK5 وبعد ذلك يمكنك ببساطة إضافة ...

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

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

نصائح أخرى

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


public class Main implements Runnable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Main());
    }

    @Override
    public void run() {
        setupEnterActionForAllButtons();

        JFrame frame = new JFrame("Button test");
        frame.getContentPane().add(createButton(), BorderLayout.NORTH);
        frame.getContentPane().add(createButton(), BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    private void setupEnterActionForAllButtons() {
        InputMap im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
        Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
        Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));

        im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
        im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
    }

    private JButton createButton() {
        JButton b = new JButton("press enter");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Pressed");
            }
        });

        return b;
    }
}

والواقع، وهذا هو الشكل والمظهر القضية. هو (وينبغي أن يكون) تصل إلى الشكل والمظهر على النحو الذي المفتاح بتشغيل زر تركيزا.

وو"الزر الافتراضي" عمل حول يعمل منذ L & F كنت تستخدم استخدامات دخول لزر الافتراضي.

والحل بطرس يتغير بشكل واضح L & F الافتراضي "التركيز العمل" الرئيسي - وهو إلى حد ما أكثر إقناعا إذا سألتني

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

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

ويمكنك القيام بذلك عن طريق تعيين خريطة الإدخال / عمل لمفتاح Enter. شيء كما يلي:

// save the command mapping for space
Object spaceMap = button.getInputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
// add a mapping from enter to the same command.
button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),spaceMap); 

ويمكنك أيضا تعيين "الزر الافتراضي" إلى الزر ركزت مؤخرا.

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

والإرشاد إلى الإجابات أعلاه للقيام نفسه مع الراديو وخانات. ودعا هذا قبل خلق مكونات

void setupEnterAction(String componentName){
    String keyName = componentName + ".focusInputMap";
    InputMap im = (InputMap) UIManager.getDefaults().get(keyName);
    Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
    Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));
    im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
    im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
}

public void setEnterEvent(){
    setupEnterAction("Button");
    setupEnterAction("RadioButton");
    setupEnterAction("CheckBox");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top