在被动渲染模式下,可以使用KeyListener和ActionListener接口来处理来自用户的事件。
全屏模式下事件处理的正确方法是什么?请扩展此框架,以提供鼠标单击和按键事件的实现,请不要膨胀您的示例(该示例开始全屏独占模式,使用aTimer更新窗口中的图形):
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(); } }); } }