事件处理程序和循环



我有一个全屏窗口,可以播放一个简单的动画,我想让它在按下任何键时,全屏都会恢复,程序也会停止。密钥侦听器类如下所示:

导入java.awt.event.*;

公共类密钥实现KeyListener{

private framerun animation=new framerun();
public void keyPressed(KeyEvent e){}
public void  keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){
    animation.x=false;
}

}

动画在一个方法中运行,运行,有一个while循环,看起来像这样:

public void run(DisplayMode dm){
        Screen s=new Screen();
        s.setFullScreen(dm, this);
        while(true){
            try{
                System.out.println(x);
                Thread.sleep(300);
            }catch(Exception e){}
            if(!x)
                s.RestoreScreen();
            repaint();
        }
    }

PS:x是一个初始值为true的布尔值,在构造函数中启动。

这是主要的方法:

public static void main(String args []){
        DisplayMode dm=new DisplayMode(800, 600,    16,DisplayMode.REFRESH_RATE_UNKNOWN);
        framerun f=new framerun();
        key k=new key();
        f.addKeyListener(k);
        f.run(dm); 
    }

现在,如果没有while循环,这将非常有效。全屏关闭,程序停止。但是当我按下一个键时,while循环没有任何响应。x的值没有如预期的那样变为false。想法?

我无法让DisplayMode切换到工作状态,但这应该不会有什么不同。

基本上,KeyListener是一个棘手的问题。它要求它所连接的组件是可聚焦的并且具有焦点。

以下示例基本上在JPanel上使用requestFocusInWindowsetFocusable的组合来尝试将焦点强制聚焦到JPanel,这样当键入密钥时,JPanel就可以对其做出响应…

import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.EventQueue;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
    public static void main(String[] args) {
        new Test();
    }
    private DisplayMode defaultMode;
    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
                GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
                defaultMode = gd.getDisplayMode();
                JFrame frame = new JFrame("Testing");
                frame.setUndecorated(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
//              DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.BIT_DEPTH_MULTI);
//              gd.setDisplayMode(dm);
                gd.setFullScreenWindow(frame);
            }
        });
    }
    public class TestPane extends JPanel {
        public TestPane() {
            setFocusable(true);
            setLayout(new GridBagLayout());
            add(new JLabel("Test"));
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    requestFocusInWindow();
                }
            });
            addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) {
                    try {
                        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
//                      gd.setDisplayMode(defaultMode);
                        gd.setFullScreenWindow(null);
                    } catch (Throwable exp) {
                        exp.printStackTrace();
                    }
                    SwingUtilities.windowForComponent(TestPane.this).dispose();
                }
            });
        }
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}

就个人而言,我建议使用密钥绑定API"如何使用密钥绑定",但这侧重于将单个密钥绑定到给定的操作,但克服了与KeyListener 相关的焦点问题

相关内容

  • 没有找到相关文章