2012-03-20 21 views
5

Có cách nào để sử dụng Nimbus LAF (Giao diện) trên OS X trong khi vẫn có thể sử dụng phím Meta để cắt/sao chép/dán và chọn tất cả các thao tác?Phím tắt của Bàn phím Mac với Nimbus LAF

Tôi hiện đang có đoạn mã sau vào phương pháp chính ứng dụng Swing của tôi, làm thay đổi lên LAF dựa trên hệ điều hành (mặc định cho OS X, Nimbus cho tất cả những người khác):

if (!System.getProperty("os.name", "").startsWith("Mac OS X")) { 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
} 

Tôi làm điều này như giải pháp thay thế vì Nimbus ghi đè phím tắt để cắt/sao chép/dán và chọn tất cả trên OS X (Phím meta so với Ctrl). Tôi muốn sử dụng Nimbus mọi lúc, nếu chỉ các phím tắt không bị ghi đè.

Trả lời

3

Sử dụng phương pháp getMenuShortcutKeyMask() hoạt động với NimbusLookAndFeel để bật khóa , như được hiển thị trong example này. Xem thêm liên quan này answer.

Trong trường hợp cụ thể là JTextField, bạn có thể sử dụng mặt nạ trong một key binding gợi lên hành động gốc.

int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); 
JTextField jtf = new JTextField("Test"); 
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, MASK), "select-all"); 
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK), "copy"); 
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_X, MASK), "cut"); 
jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, MASK), "paste"); 
+0

Tôi không thấy cách này trả lời câu hỏi. Ngay cả khi bạn gọi getMenuShortcutKeyMask() khi đăng ký các phím tắt bàn phím tùy chỉnh, điều này không sửa lỗi Ctrl-C, Ctrl-V, v.v. trong một Swing TextField mặc định khi sử dụng NimbusLookAndFeel trên OSX. – yonran

+0

@yonran: Tôi đã xây dựng ở trên. – trashgod

+0

Dường như tên hành động khác nhau theo thành phần. Vì vậy, để ánh xạ hành động "copy", bạn cũng sẽ cần phải bản đồ DefaultEditorKit.copyAction. –

1

Các thành phần khác nhau sử dụng các khóa khác nhau, để lập bản đồ tất cả, bạn sẽ phải xác định các khóa khác nhau. Ví dụ (cơ sở tìm thấy từ here):

private void addOSXKeyStrokes(InputMap inputMap) { 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.META_DOWN_MASK), DefaultEditorKit.cutAction); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), DefaultEditorKit.pasteAction); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), DefaultEditorKit.selectAllAction); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy"); 
    inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), "selectAll"); 
} 

này sau đó có thể được ánh xạ tới các thành phần khác nhau như sau:

// This must be performed immediately after the LaF has been set 
if (System.getProperty("os.name", "").startsWith("Mac OS X")) { 
    // Ensure OSX key bindings are used for copy, paste etc 
    // Use the Nimbus keys and ensure this occurs before any component creation 
    addOSXKeyStrokes((InputMap) UIManager.get("EditorPane.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("FormattedTextField.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("PasswordField.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("TextField.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("TextPane.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("TextArea.focusInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("Table.ancestorInputMap")); 
    addOSXKeyStrokes((InputMap) UIManager.get("Tree.focusInputMap")); 
} 

Một danh sách đầy đủ của Aqua (OS X Look and Feel) tên hành động được here

+0

Kudo cho liên kết nguồn! – trashgod

+0

Cảm ơn. Đã cho tôi khá lâu để tìm một ví dụ rõ ràng, vì vậy tôi cũng muốn chia sẻ nó ở đây - với những bổ sung của riêng tôi. –

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