2014-10-06 12 views
5

Tôi sử dụng một JFrame chưa được trang bị với thanh tiêu đề tùy chỉnh và trình chỉnh sửa tùy chỉnh. Tất cả các công trình tốt nhưng khi tôi thực hiện một JFrame undecorated tôi mất sự hỗ trợ cho Windows-trái/phải ràng buộc chính (có vẻ như đó là bản địa thực hiện bởi Windows). Tôi muốn thực hiện lại tính năng này cho ứng dụng của mình. Vấn đề của tôi: Tôi có thể phát hiện trong một người nghe chính cho dù phím Windows đã được nhấn, nhưng tôi không thể phát hiện một phím khác (trái/phải trong trường hợp của tôi) được nhấn cùng với phím Windows (không có biến tố WINDOWS_MASK_DOWN trong InputEvent). Có lẽ ai đó biết cách giải quyết?Hỗ trợ cho Windows-Bên trái và Windows-Phải trong các hình chữ nhật không được trang trí

Đây là mã của tôi:

import java.awt.BorderLayout; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.WindowConstants; 

public class HeadlessFrameTest { 

    public static void main(String[] args) { 
     final JFrame frm = new JFrame("Test"); 
     final JTextField field = new JTextField(); 
     frm.add(field, BorderLayout.NORTH); 
     field.addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent e) { 
       System.out.println(e); 
      } 
     }); 
     frm.setUndecorated(true); 
     frm.setSize(500, 550); 
     frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frm.setVisible(true); 
    } 

} 
+1

+1 '(không có biến tố WINDOWS_MASK_DOWN trong InputEvent) .' Không có sự kiện nào được tạo khi nhấn phím phải/trái (trong JDK7), mặc dù sự kiện được tạo cho sự kiện keyReleased. Điều này cho tôi biết rằng Windows đang chặn sự kiện này. Thật lạ khi chức năng khóa bên phải/trái không hoạt động vì phím Windows + Up không phóng to cửa sổ, mặc dù Windows + Down không khôi phục cửa sổ. Vì vậy, chắc chắn có mâu thuẫn. Tôi không biết giải pháp. – camickr

+0

Mọi cập nhật về điều này? Tôi đang gặp vấn đề tương tự và tôi đang tìm giải pháp cho vấn đề này. – Sebastian

Trả lời

1

Vâng, tôi không thể kiểm tra nó đúng như trên hệ thống của tôi, của Windows + Left hay Ngayđược chặn và xử lý bởi Windows thậm chí đối với các khung chưa được trang trí, tuy nhiên thêm trường hợp khác cho kết hợp không được sử dụng Windows + A đã chứng minh rằng mã sau hoạt động nếu hệ thống máy chủ lưu trữ d oes không tiêu thụ các phím tắt:

(Cập nhật: vì nó có vẻ là sự kiện ép chìa khóa mà Windows tiêu thụ, một thông cáo chính của của Windows + Left hay Ngay có thể được đánh bắt)

final JFrame frm = new JFrame("Test"); 
final JTextField field = new JTextField(); 
frm.add(field, BorderLayout.NORTH); 
frm.getToolkit().addAWTEventListener(new AWTEventListener() { 
    boolean winDown; 
    public void eventDispatched(AWTEvent event) { 
     KeyEvent ev=(KeyEvent)event; 
     final boolean pressed = ev.getID()==KeyEvent.KEY_PRESSED; 
     if(ev.getKeyCode()==KeyEvent.VK_WINDOWS) winDown=pressed; 
     else if(winDown) switch(ev.getKeyCode()) { 
      case KeyEvent.VK_LEFT: 
       System.out.println("windows + LEFT "+(pressed?"pressed":"released")); 
       break; 
      case KeyEvent.VK_RIGHT: 
       System.out.println("windows + RIGHT "+(pressed?"pressed":"released")); 
       break; 
      case KeyEvent.VK_A: 
       System.out.println("windows + A "+(pressed?"pressed":"released")); 
       break; 
     } 
    } 
}, KeyEvent.KEY_EVENT_MASK); 
frm.setUndecorated(true); 
frm.setSize(500, 550); 
frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
frm.setVisible(true); 

Có vẻ như một trình nghe khóa thông thường trên một thành phần không hoạt động vì thành phần mất tiêu điểm khi Windows được nhấn.

+0

Cảm ơn bạn đã trả lời, nhưng đề xuất của bạn không hoạt động (ít nhất là trên máy tính Windows của tôi). –

+0

Không hoạt động liên quan đến 'win + arrow' hoặc thậm chí là 'win + A'? Tôi sợ, cửa sổ đang chặn bàn phím 'win + arrow' ngay cả khi chúng không hoạt động. Nhưng 'win + A' đã hoạt động trên máy tính của tôi, win7 và cả jdk7 và jdk8. Do đó, tôi e rằng đó là điều gần nhất bạn có thể nhận được, nói cách khác, nếu điều đó không hiệu quả, sẽ không có giải pháp. – Holger

+0

Windows + A hoạt động, nhưng mục tiêu của tôi là Windows + ArrowLeft/Right vì người dùng biết các phím này. –

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