Pengikatan Utama lwn. Pendengar Utama dalam Java Swing: Panduan Komprehensif
Pengikatan kunci dan pendengar utama ialah dua pendekatan untuk mengendalikan peristiwa input pengguna daripada kunci dalam aplikasi Java Swing. Walaupun pendengar utama menyediakan cara yang mudah untuk mengesan penekanan kekunci, pengikatan kekunci menawarkan beberapa kelebihan, termasuk:
Memahami Pengikatan Utama
Ikatan utama melibatkan dua objek:
Apabila kekunci ditekan, peta input mencari kunci dan mencari nama tindakan. Peta tindakan kemudiannya dicari untuk nama tindakan dan melaksanakan tindakan.
Melaksanakan Pengikatan Utama
Untuk mencipta pengikatan kunci tunggal, gunakan struktur berikut:
myComponent.getInputMap().put("userInput", "myAction"); myComponent.getActionMap().put("myAction", action);
Menggunakan WHEN_IN_FOCUSED_WINDOW InputMap
InputMap for WHEN_IN_FOCUSED_WINDOW membenarkan berbilang komponen dalam tetingkap fokus menerima input secara serentak. Contohnya, jika anda mempunyai berbilang tangki dalam tetingkap fokus dan mahu ia menerima input, gunakan struktur berikut:
tank1.getInputMap(IFW).put(KeyStroke.getKeyStroke("W"), "move up"); tank2.getInputMap(IFW).put(KeyStroke.getKeyStroke("S"), "move down"); // ... tankN.getInputMap(IFW).put(KeyStroke.getKeyStroke("T"), "fire");
Kunci Mengikat Semula
Untuk mengikat semula kunci menggunakan KeyListener:
obj1.getInputMap(IFW).remove(KeyStroke.getKeyStroke(oldKey)); // ... obj1.getInputMap(IFW).put(KeyStroke.getKeyStrokeForEvent(ke), obj1.getInputMap(IFW).get(KeyStroke.getKeyStroke(oldKey)));
Kod Contoh
Berikut ialah contoh kod yang menunjukkan pengikatan kunci:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyGame extends JFrame { public MyGame() { // Do layout management, create objects, etc. JLabel obj1 = new JLabel(); JLabel obj2 = new JLabel(); // Set key bindings for object 1 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)); // Set key bindings for object 2 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 objects to the JFrame add(obj1); add(obj2); } // Handle key rebinding public static void rebindKey(KeyEvent ke, String oldKey) { // Find and replace key binding } // Main method public static void main(String[] args) { new MyGame(); } // Inner class for move action 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 logic } } // Inner class for fire action private class FireAction extends AbstractAction { int player; FireAction(int player) { this.player = player; } @Override public void actionPerformed(ActionEvent e) { // Implement fire logic } } }
Kesimpulan
Ikatan kunci menyediakan cara yang berkuasa dan fleksibel untuk mengendalikan peristiwa input pengguna dalam aplikasi Java Swing. Dengan memanfaatkan pengikatan utama, pembangun boleh meningkatkan responsif, kebolehselenggaraan dan kebolehgunaan semula aplikasi mereka.
Atas ialah kandungan terperinci Pengendalian Kunci Java Swing: Pengikatan Utama atau Pendengar Utama – Mana Yang Perlu Anda Pilih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!