2011-09-17 14 views
11

Pasif oluşturma modunda, kullanıcıdan gelen olayları işlemek için KeyListener ve ActionListener arabirimlerini kullanabilirsiniz.Java'da tam ekran özel modunda klavyeden ve fareden gelen olayları nasıl ele alırsınız?

Tam ekran modunda olay işlemenin doğru yolu nedir?

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(); 
    } 

} 

cevap

22

Öyle görünüyor: fare tıklamasıyla ve anahtar basın olayları için uygulanmasını sağlayan bu iskelet uzatmak Lütfen, örnek (örnek penceresinde grafikleri güncellemek için bir Timer kullanarak, tam ekran münhasır modu başlar) kabartmak etmeyiniz How to Use Key Bindings ve How to Write a Mouse Listener'da gösterilen normal yaklaşımlar Full-Screen Exclusive Mode'da doğru şekilde çalışır.

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

Cevabınız için teşekkür ederiz! Aynı örneği de verebilir misiniz, ama java uygulaması olarak? Ben bir java uygulaması olmak için örnek istedim, ama ilk yazıya dahil etmeyi unutmuşum gibi görünüyor ... Sağladığınız gerçek kodda sadece küçük eklemeler/değişiklikler yapmanız gerektiğini düşünüyorum, eğer bunu yaparsanız çok teşekkür ederim çünkü örneğiniz çalışmak için çok iyi! – Vadim

+2

JApplet'i öneririm, ancak güvenlik için muhtemelen [imzalanmış] (http://download.oracle.com/javase/tutorial/deployment/applet/security.html) olmalıdır. [Burada] gösterilen bir hibrid yaklaşımı kullanarak deneyebilirsiniz (https://sites.google.com/site/drjohnbmatthews/subway); [tag: java-web-start] daha iyi bir dağıtım stratejisi olurdu. – trashgod

+0

Teşekkür ederim, kontrol ediyor olacak! – Vadim

7

olarak Mac OS X kullanıcıları tam ekran uygulamaları için farklı kullanıcı beklentileri olabilir, here önerdi. here'da gösterilen alternatif bir yaklaşım, "Mac OS X'te Java uygulamalarını ince ayarlamak için yerel özellikleri kullanmanın basit bir yolunu sağlayan" com.apple.eawt sınıflarına dayanır. FullScreenUtilities yöntemi setWindowCanFullScreen() yöntemi, özelliği etkinleştirir ve Application yöntemi requestToggleFullScreen(), ayarı dinamik olarak değiştirir. Genişlet simgesinin versions arasında nasıl değiştiğine dikkat edin.

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

Ayrıca bkz. [* OSX'de Salındırma: Komut-Q Nasıl Çalışır? *] (Http://stackoverflow.com/q/2061194/230513) – trashgod

+0

Hızlı Not: 'requestToggleFullScreen' çağrısı yapılıyorsa sessizce başarısız görünüyor çerçeveden önce [görüntülenebilir] (https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#isDisplayable--). (El Capitan 10.11.6'da test) – Radiodef

İlgili konular