2011-09-17 14 views
11

Trong chế độ hiển thị thụ động, người dùng có thể sử dụng các giao diện KeyListenerActionListener để xử lý sự kiện từ người dùng.Làm thế nào để xử lý các sự kiện từ bàn phím và chuột trong chế độ độc quyền toàn màn hình trong java?

Cách xử lý sự kiện chính xác ở chế độ toàn màn hình là gì? Hãy mở rộng bộ xương này cung cấp thực hiện cho các nhấp chuột và các sự kiện nhấn phím, xin đừng sưng lên ví dụ của bạn (ví dụ bắt đầu toàn màn hình chế độ độc quyền, sử dụng một Timer để cập nhật đồ họa trong cửa sổ):

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.DisplayMode; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class applet extends Applet 
{ 
    Timer timer; 
    JFrame frame; 
    DisplayMode[] displayModes = new DisplayMode[] { 
      new DisplayMode(1280, 800, 32, 60) 
    }; 

    BufferStrategy bufferStrategy; 
    Rectangle bounds; 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * @param args 
    */ 

    public void init() 
    { 

     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); //displays, fonts, color shemes... 
     GraphicsDevice device = env.getDefaultScreenDevice(); //for one-display systems 

     setIgnoreRepaint(true); 

     GraphicsConfiguration gc = device.getDefaultConfiguration(); 
     frame = new JFrame(gc); 

     device.setFullScreenWindow(frame); 

     if (device.isDisplayChangeSupported()) 
      device.setDisplayMode(displayModes[0]); 

     frame.createBufferStrategy(2); 
     bufferStrategy = frame.getBufferStrategy(); 

     timer = new Timer(1000/50, new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       Graphics2D g = null; 
       try { 
        g = (Graphics2D) bufferStrategy.getDrawGraphics(); 
        render(g); 
       } finally { 
        g.dispose(); 
       } 
       bufferStrategy.show(); 
      } 

     }); 

    } 

    private void render(Graphics2D g) { 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, bounds.width, bounds.height); 
    } 

    public void start() 
    { 
     timer.start(); 

    } 

    public void stop() 
    { 
     timer.stop(); 
    } 

} 

Trả lời

22

Dường như các cách tiếp cận thông thường được hiển thị trong How to Use Key BindingsHow to Write a Mouse Listener hoạt động chính xác trong Full-Screen Exclusive Mode.

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowEvent; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

/** @see http://stackoverflow.com/questions/7456227 */ 
public class FullScreenTest extends JPanel { 

    private static final String EXIT = "Exit"; 
    private JFrame f = new JFrame("FullScreenTest"); 
    private Action exit = new AbstractAction(EXIT) { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       f.dispatchEvent(new WindowEvent(
        f, WindowEvent.WINDOW_CLOSING)); 
      } 
     }; 
    private JButton b = new JButton(exit); 

    public FullScreenTest() { 
     this.add(b); 
     f.getRootPane().setDefaultButton(b); 
     this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), EXIT); 
     this.getActionMap().put(EXIT, exit); 
     this.addMouseMotionListener(new MouseAdapter() { 

      @Override 
      public void mouseMoved(MouseEvent e) { 
       FullScreenTest.this.setToolTipText(
        "("+ e.getX() + "," + e.getY() + ")"); 
      } 
     }); 
    } 

    private void display() { 
     GraphicsEnvironment env = 
      GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice dev = env.getDefaultScreenDevice(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setBackground(Color.darkGray); 
     f.setResizable(false); 
     f.setUndecorated(true); 
     f.add(this); 
     f.pack(); 
     dev.setFullScreenWindow(f); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new FullScreenTest().display(); 
      } 
     }); 
    } 
} 
+0

Cảm ơn bạn đã trả lời! Bạn có thể vui lòng cung cấp cùng một ví dụ, nhưng như applet java? Tôi muốn ví dụ là một applet java, nhưng có vẻ như tôi đã quên đưa nó vào bài đăng đầu tiên ... Tôi nghĩ bạn chỉ cần thực hiện những bổ sung nhỏ/thay đổi đối với mã thực tế bạn cung cấp, sẽ rất cảm ơn nếu bạn làm điều đó , bởi vì ví dụ của bạn rất tốt để nghiên cứu! – Vadim

+2

Tôi muốn đề xuất 'JApplet', nhưng nó có thể phải được [ký] (http://download.oracle.com/javase/tutorial/deployment/applet/security.html) để bảo mật. Bạn có thể dùng thử bằng cách sử dụng phương pháp kết hợp được hiển thị [ở đây] (https://sites.google.com/site/drjohnbmatthews/subway); [tag: java-web-start] sẽ là một chiến lược triển khai tốt hơn. – trashgod

+0

Cảm ơn bạn, sẽ kiểm tra nó! – Vadim

7

Như được đề xuất here, người dùng Mac OS X có thể có kỳ vọng người dùng khác nhau đối với ứng dụng toàn màn hình. Một phương pháp thay thế, được hiển thị here, dựa trên các lớp com.apple.eawt "cung cấp một cách đơn giản để triển khai các tính năng gốc để tinh chỉnh các ứng dụng Java trên Mac OS X." Phương pháp FullScreenUtilitiessetWindowCanFullScreen() bật tính năng này và phương pháp ApplicationrequestToggleFullScreen() thay đổi cài đặt động. Lưu ý cách biểu tượng mở rộng khác nhau trong số versions.

Mac OS 10.9, Mavericks:

10.9

Mac OS 10.10, Yosemite:

10.10

Mac OS X 10.11, El Capitan:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

/** 
* @see https://stackoverflow.com/a/30308671/230513 
* @see https://stackoverflow.com/questions/7456227 
* @see https://stackoverflow.com/q/13064607/230513 
* @see https://stackoverflow.com/q/30089804/230513 
* @see https://stackoverflow.com/q/25270465/230513 
* @see http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/macosx/classes/com/apple/ 
*/ 
public class FullScreenTest extends JPanel { 

    private static final String NAME = "Mac OS X Full Screen Test"; 
    private static final String TOGGLE = "Toggle Full Screen"; 
    private final JFrame f = new JFrame(NAME); 
    private final Action exit = new AbstractAction(TOGGLE) { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      toggleOSXFullscreen(f); 
     } 
    }; 
    private final JButton b = new JButton(exit); 

    public FullScreenTest() { 
     this.add(b); 
     f.getRootPane().setDefaultButton(b); 
     this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0), TOGGLE); 
     this.getActionMap().put(TOGGLE, exit); 
     this.addMouseMotionListener(new MouseAdapter() { 

      @Override 
      public void mouseMoved(MouseEvent e) { 
       FullScreenTest.this.setToolTipText(
         "(" + e.getX() + "," + e.getY() + ")"); 
      } 
     }); 
    } 

    private void display() { 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setBackground(Color.darkGray); 
     f.add(this); 
     f.add(new JLabel(NAME, JLabel.CENTER), BorderLayout.SOUTH); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     if (System.getProperty("os.name").startsWith("Mac OS X")) { 
      enableOSXFullscreen(f); 
      toggleOSXFullscreen(f); 
      enableOSXQuitStrategy(); 
     } 
     f.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       System.out.println(e); 
      } 
     }); 
    } 

    //FullScreenUtilities.setWindowCanFullScreen(window, true); 
    private void enableOSXFullscreen(Window window) { 
     try { 
      Class util = Class.forName("com.apple.eawt.FullScreenUtilities"); 
      Class params[] = new Class[]{Window.class, Boolean.TYPE}; 
      Method method = util.getMethod("setWindowCanFullScreen", params); 
      method.invoke(util, window, true); 
     } catch (ClassNotFoundException | NoSuchMethodException | 
       SecurityException | IllegalAccessException | 
       IllegalArgumentException | InvocationTargetException exp) { 
      exp.printStackTrace(System.err); 
     } 
    } 

    //Application.getApplication().requestToggleFullScreen(window); 
    private void toggleOSXFullscreen(Window window) { 
     try { 
      Class application = Class.forName("com.apple.eawt.Application"); 
      Method getApplication = application.getMethod("getApplication"); 
      Object instance = getApplication.invoke(application); 
      Method method = application.getMethod("requestToggleFullScreen", Window.class); 
      method.invoke(instance, window); 
     } catch (ClassNotFoundException | NoSuchMethodException | 
       SecurityException | IllegalAccessException | 
       IllegalArgumentException | InvocationTargetException exp) { 
      exp.printStackTrace(System.err); 
     } 
    } 

    //Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS); 
    private void enableOSXQuitStrategy() { 
     try { 
      Class application = Class.forName("com.apple.eawt.Application"); 
      Method getApplication = application.getMethod("getApplication"); 
      Object instance = getApplication.invoke(application); 
      Class strategy = Class.forName("com.apple.eawt.QuitStrategy"); 
      Enum closeAllWindows = Enum.valueOf(strategy, "CLOSE_ALL_WINDOWS"); 
      Method method = application.getMethod("setQuitStrategy", strategy); 
      method.invoke(instance, closeAllWindows); 
     } catch (ClassNotFoundException | NoSuchMethodException | 
       SecurityException | IllegalAccessException | 
       IllegalArgumentException | InvocationTargetException exp) { 
      exp.printStackTrace(System.err); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new FullScreenTest()::display); 
    } 
} 
+0

Xem thêm [* Swing trên OSX: Cách Bẫy lệnh-Q? *] (Http://stackoverflow.com/q/2061194/230513) – trashgod

+0

Ghi chú nhanh: cuộc gọi đến 'requestToggleFullScreen' dường như không thành công nếu được thực hiện trước khung là [được hiển thị có thể hiển thị] (https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#isDisplayable--). (Thử nghiệm trên El Capitan 10.11.6.) – Radiodef

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