Rumah >Java >javaTutorial >Mengapa Menggunakan Pengikatan Utama Daripada Pendengar Utama dalam Aplikasi Swing?

Mengapa Menggunakan Pengikatan Utama Daripada Pendengar Utama dalam Aplikasi Swing?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-17 00:50:25321semak imbas

Why Use Key Bindings Instead of Key Listeners in Swing Applications?

Cara Menggunakan Pengikatan Utama Daripada Pendengar Utama

Mengapa Pertimbangkan Pengikatan Utama?

Ikatan utama menawarkan kelebihan berbanding pendengar utama, termasuk:

  • Tidak perlu mengklik komponen untuk input: Ini mengalih keluar tingkah laku yang mengelirukan pengguna dan membenarkan berbilang objek menerima input serentak.
  • Lebih mudah penyelenggaraan dan manipulasi: Pengikatan memudahkan melumpuhkan, mengikat semula dan menugaskan semula pengguna tindakan.

Melaksanakan Pengikatan Utama

Ikatan utama melibatkan dua objek: InputMap dan ActionMap. InputMap mengaitkan input pengguna dengan nama tindakan, manakala ActionMap memetakan nama tindakan kepada tindakan. Apabila kekunci ditekan, InputMap mendapatkan semula nama tindakan dan ActionMap melaksanakan tindakan yang sepadan.

Proses ini digambarkan dalam kod berikut:

myComponent.getInputMap().put("userInput", "myAction");
myComponent.getActionMap().put("myAction", action);

Menggunakan WHEN_IN_FOCUSED_WINDOW

Dalam contoh yang diberikan, InputMap menggunakan WHEN_IN_FOCUSED_WINDOW, yang membenarkan input untuk komponen dalam tetingkap fokus. Ini sesuai untuk senario di mana berbilang objek perlu menerima input secara serentak.

Contoh Pengikatan Kekunci

Contoh yang disediakan dalam kod soalan boleh diubah suai untuk menggunakan pengikatan kunci, seperti yang ditunjukkan di bawah:

import javax.swing.*;

public class MyGame extends JFrame {

    private static final String MOVE_UP = "move up";
    private static final String MOVE_DOWN = "move down";
    private static final String FIRE = "move fire";

    static JLabel obj1 = new JLabel();
    static JLabel obj2 = new JLabel();

    public MyGame() {

        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("UP"), MOVE_UP);
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("DOWN"), MOVE_DOWN);
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("control CONTROL"), FIRE);

        obj1.getActionMap().put(MOVE_UP, new MoveAction(1, 1));
        obj1.getActionMap().put(MOVE_DOWN, new MoveAction(2, 1));
        obj1.getActionMap().put(FIRE, new FireAction(1));

        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("W"), MOVE_UP);
        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("S"), MOVE_DOWN);
        obj2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStroke("T"), FIRE);

        obj2.getActionMap().put(MOVE_UP, new MoveAction(1, 2));
        obj2.getActionMap().put(MOVE_DOWN, new MoveAction(2, 2));
        obj2.getActionMap().put(FIRE, new FireAction(2));

        add(obj1);
        add(obj2);
    }

    static void rebindKey(KeyEvent ke, String oldKey) {

        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .remove(KeyStroke.getKeyStroke(oldKey));
        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                .put(KeyStroke.getKeyStrokeForEvent(ke),
                        obj1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
                                .get(KeyStroke.getKeyStroke(oldKey)));
    }

    public static void main(String[] args) {

        new MyGame();
    }

    private class MoveAction extends AbstractAction {

        int direction;
        int player;

        MoveAction(int direction, int player) {

            this.direction = direction;
            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            // Implement move action for the player.
        }
    }

    private class FireAction extends AbstractAction {

        int player;

        FireAction(int player) {

            this.player = player;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            // Implement fire action for the player.
        }
    }
}

Tambahan Ciri-ciri

Ikatan kekunci memberikan keupayaan tambahan:

  • Kekunci ikat semula: Gantikan kunci yang dikaitkan dengan tindakan dengan mudah.
  • Lumpuhkan tindakan: Elakkan tindakan tertentu daripada wujud buat sementara waktu dilakukan.
  • Kawal tindakan terus: Akses tindakan terus untuk kawalan selanjutnya.

Atas ialah kandungan terperinci Mengapa Menggunakan Pengikatan Utama Daripada Pendengar Utama dalam Aplikasi Swing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn