2010-01-07 33 views
7

Tôi có một mục menu, "đổi tên", mà F2 được đặt làm bộ gia tốc. Thật vậy khi trình đơn được hiển thị có một dấu "F2" nhỏ bên cạnh "đổi tên".Swing: Đặt khóa chức năng (F2) làm máy gia tốc

Đáng buồn thay, điều này không hiệu quả. Máy gia tốc này không gây ra phản ứng. Khi tôi thay đổi máy gia tốc thành CTRL + F2 - nó hoạt động.

Dường như tôi nên sử dụng InpoutMpa/ActionMap. Vấn đề với điều đó là tôi muốn nó hoạt động ở mọi nơi trong ứng dụng nên tôi đang cố gắng kết hợp nó với JFrame cấp cao nhất. Nhưng, JFrame không có phương thức getInputMap().

Bị mất.

[Added]

 ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 
    JMenuItem mi = new JMenuItem("Rename"); 
    mi.setAccelerator(ks); 
    mi.addActionListener(action); 
+1

Xin chỉ cho chúng ta mã hóa bạn sử dụng để thiết lập các gia tốc! –

+3

Có thể trình quản lý hệ điều hành/cửa sổ của bạn "tiêu thụ" phím tắt để nó thực sự không bao giờ đến ứng dụng Swing của bạn (ví dụ: vì F2 được ánh xạ tới một thứ gì đó đặc biệt và Ctrl-F2 không)? – netzwerg

Trả lời

4

Đây có thể xảy ra bởi vì JTable sử dụng F2 để gọi hành động StartEditing (tôi thấy hành vi tương tự trên một trong những chương trình của tôi và bắt nguồn từ nó đến này).

Có một vài giải pháp. Các quyết liệt nhất là để loại bỏ bản đồ đầu vào này (Tôi tin rằng mã này thực sự loại bỏ các ánh xạ từ tất cả JTables):

KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0); 

InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
while (imap != null) 
{ 
    imap.remove(keyToRemove); 
    imap = imap.getParent(); 
} 

Hoặc, nếu bạn đang sử dụng bảng cho chỉ hiển thị, và không có ý định để cho chỉnh sửa sử dụng nó, bạn có thể làm cho nó không thể đặt tiêu điểm:

table.setFocusable(false); 

Mở một chủ đề hoàn toàn khác nhau, tôi khuyên bạn nên tạo một lớp con AbstractAction cho các mục menu của bạn, chứ không phải tạo ra chúng "từ đầu". Ngoài việc cung cấp cho bạn mã thiết lập trình đơn rất đơn giản, bạn có thể sử dụng cùng một cá thể hành động cho cả menu chính và cửa sổ bật lên/thanh công cụ và bật/tắt cả hai cùng một lúc.

4

Tôi biết đây là một chủ đề cũ, nhưng tôi đã vật lộn với chính xác điều tương tự như áp phích gốc và tìm ra giải pháp. Bản thân JFrame không có phương thức getInputMap, nhưng khung gốc của nó thì không. Vì vậy, bạn phải sử dụng "getRootPane.getInputMap" để thay thế. đang

Ví dụ:

public class ApplicationFrame extends JFrame { 
    private AbstractAction f2Action = new AbstractAction() { 
     private static final long serialVersionUID = 1L; 

     public void actionPerformed(ActionEvent e) { 
      // Do something useful 
     } 
    }; 

    public ApplicationFrame() { 

     InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = getRootPane().getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action"); 
     actionMap.put("f2Action", f2Action); 

    } 
} 
+1

hmm .. đừng nghĩ rằng ràng buộc này sẽ hoạt động khi một trình tăng tốc menu không. – kleopatra

+0

Máy gia tốc là một ràng buộc được thêm vào một nơi nào đó. Vấn đề là một cái gì đó dọc theo cây thành phần là nắm bắt các phím tắt trước khi nó đạt đến ràng buộc. Tôi đã giải quyết điều này bằng cách viết một phương thức di chuyển toàn bộ cây Container và loại bỏ phím tắt từ bản đồ đầu vào của bất kỳ JComponent nào mà nó tìm thấy. –

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