2011-09-16 43 views
9

Tôi đang tạo một ứng dụng có java có JTextPane. Tôi muốn có thể thực thi một số mã khi nhập nhập (hoặc khi người dùng chuyển sang dòng tiếp theo). Tôi đã xem trên web và không tìm thấy giải pháp. Nó sẽ là tốt hơn để giải quyết điều này với C#? Nếu không, làm thế nào tôi có thể đăng ký phím Enter trong sự kiện keyTyped() của JTextPane? Nếu C# là một lựa chọn tốt, làm thế nào tôi sẽ làm điều này trong C#?Java: Đăng ký <ENTER> nhấn phím trên JTextPane

Dưới đây là một giải pháp tôi nghĩ sẽ làm việc ... nhưng không

//Event triggered when a key is typed 
private void keyTyped(java.awt.event.KeyEvent evt) { 
    int key = evt.getKeyCode(); 
    if (key == KeyEvent.VK_ENTER) { 
     Toolkit.getDefaultToolkit().beep(); 
     System.out.println("ENTER pressed"); 
    } 
} 

Tại sao ví dụ trên không hoạt động là bởi vì không có vấn đề mà chính tôi bấm, tôi nhận được một keyCode của 0. Tôi sẽ thích một giải pháp cho vấn đề này trong Java nhưng C# cũng sẽ làm việc tốt, có lẽ tốt hơn. Ngoài ra, hãy cố gắng trả lời câu hỏi bằng các ví dụ và không liên kết (trừ khi bạn thực sự cần). Cảm ơn!

+0

không sử dụng keyListeners, sử dụng keyBindings như @Hovercraft đề xuất – kleopatra

+0

Từ JavaDocs cho getKeyCode(): 'Đối với các sự kiện KEY_TYPED, mã khóa là VK_UNDEFINED.' Nó được ghi nhận như vậy ít nhất là từ 1.3. –

Trả lời

13

Một giải pháp là thêm ràng buộc khóa vào ô văn bản. ví dụ:

JTextPane textPane = new JTextPane(); 

    int condition = JComponent.WHEN_FOCUSED; 
    InputMap iMap = textPane.getInputMap(condition); 
    ActionMap aMap = textPane.getActionMap(); 

    String enter = "enter"; 
    iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), enter); 
    aMap.put(enter, new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("enter pressed"); 
    } 
    }); 
+3

+1 cho [ràng buộc khóa] (http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), mặc dù hành động chèn-ngắt mặc định sẽ bị mất. – trashgod

+2

@trashgod đúng, nhưng yêu cầu không hoàn toàn rõ ràng, có thể là a) thay thế hành vi mặc định hoặc b) thêm vào hành vi mặc định Đối với b) chỉ cần bọc mặc định và kích hoạt trong tuỳ chỉnh – kleopatra

1

Câu trả lời này là trong trường hợp ai đó xem chủ đề này Tôi có những thứ giống như ông Mohammad Adib. Vì vậy, thay vì sử dụng (evt.getKeyCode() == evt.VK_ENTER) tôi sử dụng (evt.getKeyChar() == '\ n')

and the solution worked. 
+0

nhận xét của tôi cho câu hỏi vẫn giữ: không sử dụng keyListeners ... bao giờ hết. Có các giải pháp trên mức trừu tượng cao hơn, xem câu trả lời của @ trashgod – kleopatra

+0

Từ JavaDocs cho getKeyCode(): 'Đối với các sự kiện KEY_TYPED, mã khóa là VK_UNDEFINED.' Nó được ghi nhận như vậy ít nhất là từ 1.3. Tôi đoán OP không bao giờ đọc tài liệu. –

0

Tôi đang tìm kiếm ENTER then chốt trong mật khẩu trường văn bản, để khởi chạy phương thức đăng nhập khi nhấn ENTER. Mã dưới đây sẽ in trong bàn phím điều khiển. Sau khi chạy chương trình và gõ một vài tihngs trong hộp tôi phát hiện ra cho phím Enter nó là mã 13.

txtPass = new Text(shlLogin, SWT.BORDER | SWT.PASSWORD); 
    txtPass.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println(e.keyCode); 
      if (e.keyCode == 13) { /* ... Do your stuff ... */ } 
     } 
    }); 

Nếu bạn đang tìm kiếm một phím bấm duy nhất, bạn vẫn có thể là một chút lười biếng và tránh học mới công cụ về các ràng buộc chính, bằng cách sử dụng phương pháp này. Điều thú vị bắt đầu khi thêm phím tắt CTRL + [Letter] - nhưng đây là một cuộc thảo luận khác.

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