2010-08-25 31 views
5

Tôi cần có khả năng phát hiện xem có một phím nào đó (ví dụ: CTRL) được nhấn trong một hoạt động cụ thể của tôi hay không. Tôi không có quyền truy cập vào một người nghe chính, cũng không phải một sự kiện chuột. Những gì tôi hy vọng là sẽ có một số lớp có một phương thức như "boolean isKeyPressed (keycode)".Java - Chúng tôi có thể phát hiện nếu một phím được nhấn mà không sử dụng Trình nghe không?

Có ai biết phương pháp như thế này trong java không?

Đối với một chút nền, tôi đang cố gắng ghi đè hành vi thả mặc định & thả cho một thành phần. Theo mặc định, theo javadocs cho DropTargetDragEvent, nếu không có phím bổ trợ nào được nhấn, thì nó sẽ xuất hiện trong danh sách tác vụ được hỗ trợ của thành phần để di chuyển, sau đó sao chép & rồi liên kết và dừng sau khi tìm kiếm đầu tiên.

Trong đơn đăng ký của mình, chúng tôi hỗ trợ cả liên kết copy &. Theo javadoc, không nhấn phím CTRL, hành động mặc định sẽ được sao chép. Chúng tôi muốn người dùng có thể chỉ định hành động mặc định (cho phép họ đặt hành động thường được sử dụng nhất) và sau đó buộc một người cụ thể sử dụng các phím bổ trợ.

Nếu tôi có thể phát hiện trạng thái nhấn phím thì tôi có thể buộc điều này xảy ra nhưng tôi không thể thấy bất kỳ cách nào khác để thay đổi hành động mặc định.

Xin cảm ơn trước, Brian

+5

Tại sao bạn không có quyền truy cập vào người nghe? Bạn không thể tạo của riêng mình? Bạn đang sử dụng khung GUI nào? –

+0

Noel - có vẻ như bình luận của tôi đối với bài đăng của Erick Robertson. – DaddyB

Trả lời

0

Ngay cả khi có phương pháp như vậy, bạn muốn làm gì với phương pháp này? Gọi nó trong một vòng lặp vô tận với hy vọng nó trở lại đúng tại một số điểm? Tôi nghĩ rằng một cơ chế dựa trên sự kiện/nghe dựa trên phù hợp hơn nhiều trong trường hợp này.

+1

không phải là vòng lặp vô tận, không. chỉ cần gọi theo yêu cầu trong một hoạt động nhất định (gọi lại trong khi kéo và thả). – DaddyB

5

Phương thức MouseEvent.getModifiers() sẽ trả lại bitmap của các phím bổ trợ được nhấn tại thời điểm MouseEvent được tạo. Hoặc, bạn có thể sử dụng MouseEvent.isControlDown() để kiểm tra cụ thể phím CTRL.

+0

Tôi đồng ý rằng trong một thế giới lý tưởng, người nghe chính có thể là tốt nhất. tuy nhiên, theo ý kiến ​​của tôi, có một số vấn đề với cách tiếp cận này cho kịch bản của tôi: Tôi phải đính kèm người nghe vào điều gì? ứng dụng của tôi khá phức tạp về giao diện người dùng và cũng có thể tùy chỉnh thông qua plugin. Tôi đã xem xét gắn một Listener vào chuỗi sự kiện, nhưng điều này kết thúc việc xử lý tất cả các sự kiện quan trọng và do đó có thể có các hàm ý hiệu suất ở nơi khác. tương tự như vậy, khả năng mở rộng của ứng dụng có nghĩa là tôi không nhất thiết phải có cách để phát hiện sự bắt đầu kéo và vì vậy tôi không thể chọn lọc người nghe trên – DaddyB

+0

Tôi vừa mới chơi với một người nghe chính và chỉ ra rằng các sự kiện quan trọng không bị sa thải trong khi một nút chuột được giữ lại (và tôi đang làm việc với kéo và thả ở đây) và để quy tắc ra một người nghe chính. Tôi đoán tôi có thể nhìn vào một người nghe chuột toàn cầu và kiểm tra trạng thái của các modifier nhưng điều này có vẻ như quá mức cần thiết cho vấn đề này. – DaddyB

+0

Tôi đã cập nhật phản hồi của mình - bạn có thể kiểm tra MouseEvent được tạo mỗi lần di chuyển hoặc kéo chuột. –

0

Tôi nghĩ rằng bạn đang đi về điều này một cách sai lầm. Những gì bạn muốn làm là thay đổi hành động khi kéo được bắt đầu, không phải khi nó được thả. Có nhiều cách để thay đổi hành động bắt đầu, bao gồm việc thẩm vấn tùy chọn của người dùng trong trường hợp "không sửa đổi". Có thể thay đổi cách DropTargetDragEvent được gọi.

+0

Tôi đồng ý - nhưng tôi đã không thể tìm ra cách đặt trường hợp "không có sửa đổi" trong mã - javadocs (xem liên kết trong bài đăng gốc của tôi) cho biết rằng bản sao có ưu tiên hơn liên kết. Nếu bạn có bất kỳ đề xuất về cách làm điều này thì nó sẽ được nhiều đánh giá cao. – DaddyB

1

Đây có thể là một cách bẩn thỉu để đi về nó. Nhưng điều này cho phép bạn ghi lại các sự kiện quan trọng và sau đó truy vấn chúng.

//register this somewhere in the startup of your application 
KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
    mgr.addKeyEventDispatcher(KeyEventRecorder.getInstance()); 

//then can query events later 
    KeyEvent keyEvt = KeyEventRecorder.getLastEvent(); 
    if(keyEvt != null && keyEvt.getKeyCode() == KeyEvent.VK_CONTROL && keyEvt.getID() == KeyEvent.KEY_PRESSED) 
     //do something.. 

    private class KeyEventRecorder implements KeyEventDispatcher 
    { 
     private static KeyEvent lastEvent; 
     private static KeyEventRecorder myInstance; 

     private KeyEventRecorder() 
     { 
      super(); 
     } 

     public static synchronized KeyEventRecorder getInstance() 
     { 
      if(myInstance == null) 
       myInstance = new KeyEventRecorder(); 
      return myInstance; 
     } 

     /** 
     * retrieve the last KeyEvent dispatched to this KeyEventDispatcher 
     */ 
     public static KeyEvent getLastEvent() 
     { 
      return lastEvent; 
     }//method 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) 
     { 
      lastEvent = e; 
      //return false to let KeyboardFocusManager redistribute the event elsewhere 
      return false; 
     }//method 
    }//class 
Các vấn đề liên quan