Rumah >Java >javaTutorial >Mengapa Menggunakan Pengikatan Utama Daripada Pendengar Utama dalam Aplikasi Swing?
Cara Menggunakan Pengikatan Utama Daripada Pendengar Utama
Mengapa Pertimbangkan Pengikatan Utama?
Ikatan utama menawarkan kelebihan berbanding pendengar utama, termasuk:
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:
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!