Wie behandelt man Ereignisse von Tastatur und Maus im exklusiven Vollbildmodus in Java?
Lesezeit: 6 Minuten
Wadim
Im passiven Rendering-Modus kann man verwenden KeyListener und ActionListener Schnittstellen zur Behandlung von Ereignissen des Benutzers.
Was ist die richtige Art der Ereignisbehandlung im Vollbildmodus? Bitte erweitern Sie dieses Gerüst, indem Sie die Implementierung für Mausklick- und Tastendruckereignisse bereitstellen, bitte blähen Sie Ihr Beispiel nicht auf (das Beispiel startet den exklusiven Vollbildmodus mit a Timer Grafiken im Fenster aktualisieren):
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();
}
}
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();
}
});
}
}
Danke für die Antwort! Könnten Sie bitte auch das gleiche Beispiel geben, aber als Java-Applet? Ich wollte, dass das Beispiel ein Java-Applet ist, aber anscheinend habe ich vergessen, das in den ersten Beitrag aufzunehmen … Ich denke, Sie müssen nur kleine Ergänzungen / Änderungen am eigentlichen Code vornehmen, den Sie bereitgestellt haben. Ich bin Ihnen sehr dankbar, wenn Sie das tun , weil Ihr Beispiel sehr gut zum Lernen ist!
– Wadim
17. September 2011 um 20:22 Uhr
Ich würde vorschlagen JAppletaber das müsste es wohl sein unterzeichnet für Sicherheit. Sie können es mit einem hybriden Ansatz versuchen, der gezeigt wird Hier; java-web-start wäre eine bessere Bereitstellungsstrategie.
– Müllgott
17. September 2011 um 21:04 Uhr
Danke, werde es prüfen!
– Wadim
17. September 2011 um 21:09 Uhr
@Vadim Beachten Sie, dass Java 1.7 in OSX tatsächlich einen Fehler mit dieser Technik hat stackoverflow.com/questions/14317352.
– sage88
29. September 2013 um 9:16 Uhr
Siehe auch FullScreen Swing-Komponenten empfangen keine Tastatureingaben unter Java 7 auf Mac OS X Mountain Lion.
– Müllgott
18. Mai 2015 um 16:10 Uhr
Müllgott
Wie hier angedeutet, haben Benutzer von Mac OS X möglicherweise andere Benutzererwartungen für Vollbildanwendungen. Ein alternativer Ansatz, der hier gezeigt wird, beruht auf com.apple.eawt Klassen, die “eine einfache Möglichkeit bieten, native Funktionen zur Feinabstimmung von Java-Anwendungen unter Mac OS X zu implementieren.” Die FullScreenUtilities Methode setWindowCanFullScreen() aktiviert die Funktion und die Application Methode requestToggleFullScreen() ändert die Einstellung dynamisch. Beachten Sie, wie sich das Erweiterungssymbol unterscheidet Versionen.
Siehe auch Swing unter OSX: Wie kann man Befehl-Q abfangen?
– Müllgott
29. März 2016 um 1:50 Uhr
Kurzer Hinweis: Der Anruf an requestToggleFullScreen scheint lautlos zu scheitern, wenn es vor dem Rahmen gemacht wird darstellbar gemacht. (Testen auf El Capitan 10.11.6.)
– Radiodef
30. November 2017 um 0:22 Uhr
9276100cookie-checkWie behandelt man Ereignisse von Tastatur und Maus im exklusiven Vollbildmodus in Java?yes