2013-08-01 46 views
7

Tôi đang cố tạo các ràng buộc chính trong Java trên JPanel. Tôi muốn có một hành động nhất định để thực hiện khi tôi nhấn nút 'w'. Tôi làm theo hướng dẫn Java về cách tạo các ràng buộc, nhưng phương thức actionPerformed không thực thi (tức là không có văn bản in ra). Sau đây là toàn bộ mã cho GUI thử nghiệm của tôi, với phần liên quan được đánh dấu:Ràng buộc khóa Java không hoạt động

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

@SuppressWarnings("serial") 
public class Test extends JFrame{ 

private JPanel panel; 

public Test(){ 
    super(); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(500,500); 
    setLayout(new BorderLayout()); 
    setVisible(true);   
    panel = new JPanel(); 

    // HERE ARE THE KEY BINDINGS 
    panel.getInputMap().put(KeyStroke.getKeyStroke('w'),"forward"); 
    panel.getActionMap().put("forward", new AbstractAction(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("test"); 
     } 
    }); 
    // END OF KEY BINDINGS 

    add(panel, BorderLayout.CENTER); 
} 

public static void main(String[] args){ 
    new Test();  
} 

} 

Văn bản "kiểm tra" không bao giờ được in. Tôi đã thử nhiều lần với nhiều biến thể khác nhau, các khóa khác nhau và tôi đảm bảo bảng điều khiển đang được tập trung, nhưng không có may mắn. Tôi đang làm gì sai?

Trả lời

13

Vấn đề là cách bạn đang tìm kiếm KeyStroke. KeyStroke.getKeyStroke('w') sẽ trả lại typed w, vì lý do nào đó, không kích hoạt sự kiện quan trọng. Đây là lý do tại sao tôi có xu hướng tránh phương pháp này. Thay vì sử dụng

panel.getInputMap().put(KeyStroke.getKeyStroke("W"),"forward"); 

hoặc

panel.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0),"forward"); 

Ngoài ra, bạn có thể muốn xác định các hạn chế tập trung cho InputMap, một cái gì đó giống như

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)... 

sẽ được an toàn hơn ... nhưng bạn sẽ cần để quyết định mức độ nào bạn muốn các nét chính được kích hoạt từ

Xem JComponentHow to use Key Bindings để biết thêm chi tiết

cập nhật với ví dụ

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test extends JFrame { 

    private JPanel panel; 

    public Test() { 
     super(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(500, 500); 
     setLayout(new BorderLayout()); 
     setVisible(true); 
     panel = new JPanel(); 

     // HERE ARE THE KEY BINDINGS 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), "forward"); 
     panel.getActionMap().put("forward", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("test"); 
      } 
     }); 
     // END OF KEY BINDINGS 

     add(panel, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       new Test(); 
      } 
     }); 
    } 
} 
+0

đã không nhận thấy bạn đang sử dụng ' 'w'', nghĩ bạn đang sử dụng' "w" '. Đã cập nhật với ví dụ hoạt động – MadProgrammer

Các vấn đề liên quan