2011-04-30 34 views
10

Tôi đã viết một giao diện người dùng SWT có chức năng chính hiển thị văn bản trong điều khiển StyledText. Tôi muốn thêm một handler cho Ctrl +F để khi tắt mà được nhấn trọng tâm được đặt thành một hộp tìm kiếm. Tôi đã thử sử dụng mã sau đây để phát hiện phím bấm.Cách phát hiện ctrl-f trong ứng dụng SWT của tôi

sWindow = new Shell(); 
... 
sWindow.getDisplay().addFilter(SWT.KeyDown, new Listener() 
{ 
    @Override 
    public void handleEvent(Event e) 
    { 
    System.out.println("Filter-ctrl: " + SWT.CTRL); 
    System.out.println("Filter-mask: " + e.stateMask); 
    System.out.println("Filter-char: " + e.character); 
    } 
}); 

Tôi đã mong rằng khi tôi ép Ctrl +f tôi sẽ thấy kết quả như sau:

Filter-ctrl: 262144 
Filter-mask: 262144 
Filter-char: f 

Tuy nhiên, trong thực tế tôi thực sự thấy như sau.

Filter-ctrl: 262144 
Filter-mask: 262144 
Filter-char: <unprintable char - displayed as a box in eclipse console> 

Tôi có hai câu hỏi:

  • là Display.addFilter (...) là cách tốt nhất để thêm một phím tắt toàn cầu? Tôi đã thử Display.addListener (...) nhưng điều này không nhận được bất kỳ sự kiện nào cả.
  • Tại sao tôi không nhận được nhân vật ép khi tôi đang giữ phím Ctrl ? Khi tôi giữ phím alt hoặc shift, tôi nhận được mặt nạ mong đợi và nhân vật được ép.

Trả lời

31

Is Display.addFilter(...) the best way to add a glbal shortcut? I tried Display.addListener(...) but this didn't receive any events at all.

Vâng, thường Display.addFilter(...) là cách tốt nhất để thêm một phím tắt glbal bởi vì họ có sở thích cao hơn so với người nghe sự kiện. Xem nhận xét bên dưới từ Display.addFilter(...) javadoc.

Bởi vì bộ lọc sự kiện chạy trước thính giả khác, các bộ lọc sự kiện có thể vừa khối thính giả khác và thiết lập lĩnh vực tùy ý trong một sự kiện. Đối với lý do này, bộ lọc sự kiện vừa là mạnh mẽ và nguy hiểm. Họ nên tránh để thực hiện, gỡ lỗi và bảo trì mã lý do.


Đối với câu hỏi thứ hai của bạn:

Why don't I get the pressed character when I'm holding down ctrl? When I hold down alt or shift I get the expected mask and the pressed character.

Vấn đề là bạn đang tìm kiếm tại địa điểm sai. Thay vì truy vấn e.character, bạn nên sử dụng e.keyCode. Theo javadoc của e.character bạn sẽ không nhận được chỉ là nhân vật f:

Tùy thuộc vào sự kiện, nhân vật đại diện bởi phím được gõ. Đây là ký tự cuối cùng mà kết quả sau khi tất cả các công cụ sửa đổi đã được áp dụng .Ví dụ: khi người dùng loại Ctrl + A, giá trị ký tự là 0x01 (ASCII SOH).

Vì vậy, khi bạn nhấn tổ hợp phím CTRL + f sau đó nó chuyển đổi trong 0x06 (ASCII ACK). Mà không phải là trường hợp khi bạn làm ALT +fhaySHIFT +f.

Mặt khác javadoc của e.keyCode nói:

tùy thuộc vào sự kiện, các mã chủ chốt của khóa được gõ, như đã định nghĩa bởi các hằng số mã chủ chốt trong lớp SWT. Khi trường ký tự của sự kiện không rõ ràng, trường này chứa giá trị không bị ảnh hưởng của ký tự gốc . Ví dụ: nhập Ctrl + M hoặc Nhập cả hai kết quả trong ký tự '\ r' nhưng trường mã phím cũng sẽ chứa '\ r' khi nhập Nhập và 'm' khi nhấn Ctrl + M .

Kiểm tra mã bên dưới để biết thêm chi tiết. Đối với bản demo tôi đã cố gắng để đưa người nghe vào DisplayTest.

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.KeyEvent; 
import org.eclipse.swt.events.KeyListener; 
import org.eclipse.swt.graphics.Color; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 

public class ControlF 
{ 
    public static void main(String[] args) 
    { 

     Display display = new Display(); 

     final Shell shell = new Shell (display); 
     final Color green = display.getSystemColor (SWT.COLOR_GREEN); 
     final Color orig = shell.getBackground(); 

     display.addFilter(SWT.KeyDown, new Listener() { 

      public void handleEvent(Event e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        System.out.println("From Display I am the Key down !!" + e.keyCode); 
       } 
      } 
     }); 

     shell.addKeyListener(new KeyListener() { 
      public void keyReleased(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(orig); 
        System.out.println("Key up !!"); 
       } 
      } 
      public void keyPressed(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(green); 
        System.out.println("Key down !!"); 
       } 
      } 
     }); 

     shell.setSize (200, 200); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 

    } 
} 
+0

Đây là câu trả lời tuyệt vời - Tôi hiện đã có phím tắt hoạt động. Cảm ơn! Tôi sẽ cố đọc tài liệu tốt hơn vào lần sau! – mchr

+0

Điều đó đã giải quyết được vấn đề của tôi, nhờ lời giải thích rõ ràng! +1 –

+0

cách chúng tôi có thể ghi đè lối tắt hệ thống như ctrl + c bằng cách thêm bộ lọc như thế này? – Fahad

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