当前位置: 首页 > 面试题库 >

如何在Java中以全屏独占模式处理来自键盘和鼠标的事件?

苏俊友
2023-03-14
问题内容

在被动渲染模式下,可以使用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();
            }
        });
    }
}


 类似资料:
  • 问题内容: 想象一下,当从控制台调用NodeJS模块时,它会输出一些介绍性消息,然后等待用户输入(单击enter或esc)。该模块已经具备并完成了我们所需的一切,除了- 等待用户输入提示。因此,我们想知道(我个人对NodeJS还是很陌生的)是否有可能以编程方式执行控制台模块并触发其上的输入事件,以便它不等待并立即进行工作? 问题答案: 您可以为此使用RobotJS。 示例代码:

  • 导语 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。对于初学者,总会对Qt中信号和事件的概念混淆不清。其实,记住事件比信号更底层就可以了。比如说,我们用鼠标按下界面上的一个按钮,它会发射clicked()单击信号,但是,它怎么知道自己被按下的呢,那就是通过鼠标事件处理的。这里可以看到,鼠标事件比信号更底层。 在Qt中处理事件有多种方法,不过最常用的是重写Qt事件处理

  • 我需要对按键-鼠标事件组合做出反应,如: CtrlShiftR 但是我不知道,只有在按住Ctrl键和Shift键的组合出现时,如何处理“左键单击”的问题。 像这样的解决方案 不会工作,因为可能有不同的组合键和任何种类的字母。 有什么想法吗?

  • 如何处理软键盘和隐藏它使用appium Android。 以下是我的设想: 打开flipkart应用 点击搜索图标 键入一些文本[例如:汽车] 从设备键盘点击搜索图标 下面是我实现的代码: 我使用driver.rotate(屏幕定位。LANDSCAPE);"在代码中,但得到错误作为org.openqa.selenium.WebDriverExcture:一个未知的服务器端错误发生在处理命令。(警告

  • 我的代码是: 在上面的代码中,mBooleanLoginDone是一个布尔变量,指示用户是否登录。我希望快捷键Ctrl和T仅在用户成功登录时起作用,但现在我还没有登录,快捷键也起作用。我怎样才能解决它?有什么想法吗?

  • 问题内容: 如何在Python中控制鼠标和键盘? 这个想法与Java中的Robot()类相同。可以说:将鼠标从此处移至此处,单击此处,然后将其写在屏幕上。 对于Windows,有win32api,但我主要使用Linux。 对于Linux,有Xlib,但它也适用于键盘吗?(仅找到对鼠标的引用) 有跨平台的解决方案吗?(Linux,Windows甚至OS X都很棒。) 问题答案: 对于鼠标,我发现py