2009-12-22 17 views
8

Tôi gặp sự cố với setAccelerator(). Ngay bây giờ, tôi có mã hoạt động cho Ctrl + X cho thao tác DELETE. Tôi muốn thiết lập máy gia tốc để Shift + Xóa cũng cho cùng một JMenuItem.Có thể xác định nhiều bộ gia tốc cho một JMenuItem không?

Mã của tôi như sau:

JMenuItem item = new JMenuItem(menuText); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK)); 
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK)); 

nhưng điều này đang làm việc chỉ cho Shift + Delete hoạt động. Dường như nó đang ghi đè thao tác Ctrl + X. Chúng ta có thể làm cho cả hai tổ hợp phím này hoạt động cùng một lúc?

Vui lòng hướng dẫn.

Trả lời

3

Từ: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

Các mặt nạ cũng được sử dụng để xác định mà loại sự kiện một AWTEventListener nên lắng nghe.

Vì vậy, bạn có thể kết hợp mặt nạ cho hai khóa, nhưng không thể kết hợp KeyEvents.

item.setAccelerator( 
    KeyStroke.getKeyStroke(
     KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK)); 

Một giải pháp workaround sẽ được bắt KeyEvent ở giữa (sau khi thành phần của bạn bắn nó, nhưng trước khi người nghe của bạn sẽ hoạt động trên nó) và kiểm tra, cho dù nó là một trong hai kết hợp. Sau đó, kích hoạt một sự kiện, trên đó bạn đồng ý lập trình đại diện cho hành động bạn muốn.

+0

Đó phải là OR thay vì PLUS: 'KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK' – MondKin

0

Cuộc gọi thứ hai thực sự ghi đè máy gia tốc. Nếu phương thức bắt đầu bằng tập hợp, sẽ chỉ có một. Nếu phương thức bắt đầu bằng việc thêm, bạn có thể có nhiều hơn một phương thức (ví dụ cho một số người nghe).

Nếu bạn muốn nhiều lần nhấn phím để làm như vậy, tôi nghĩ bạn nên thêm một keyListener vào khung trên cùng (hoặc bảng điều khiển, hộp thoại, ...) sẽ gọi trình lắng nghe hành động được thêm vào menuItem.

7

Có thể thực hiện được. Đằng sau các cảnh setAccelerator() chỉ là tạo một ràng buộc khóa, tuy nhiên khi bạn nhận thấy ràng buộc thứ hai thay thế đầu tiên.

Vì vậy, bạn cần phải tạo một Hành động (không phải là một ActionListener) để thêm vào mục menu. Đọc phần từ hướng dẫn Swing trên How to Use Actions để biết thêm thông tin. Bây giờ bạn đã tạo Action, bạn có thể chia sẻ Action với một KeyStroke khác bằng cách tạo thủ công một Key Binding. Bạn có thể đọc phần từ hướng dẫn Swing trên How to Use Key Bindings để có giải thích chi tiết. Hoặc bạn có thể đọc blog của tôi trên Key Bindings cung cấp một số ví dụ mã đơn giản.

Ràng buộc thứ hai này sẽ không hiển thị trên chính mục menu.

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