如何阻止Jframe窃取键盘输入

时间:2019-10-11 17:20:05

标签: java focus

我已经用Java编写了一个程序,该程序每8秒检查一次restAPI,如果它检测到状态变化,则在屏幕的右下角闪烁一个小警报。该警报旨在将严重情况通知用户,但不会中断他们的工作。我的问题是,当触发警报并且JFrame变得可见时,它会窃取键盘输入。因此,在闪烁时,如果用户想继续在其他应用程序中工作,则他们必须不断地单击该应用程序。

我在JFrame上使用setVisible(将其从false更改为true,然后再次返回)以创建“闪烁”效果。每次将JFrame.setVisible设置为true时,Windows都会自动将键盘输入聚焦在警报上。

我尝试在初始化JFrame时添加setFocusable(false),但这似乎没有任何效果。

这是我初始化Jframe的方法:

public AlertJFrame(int pos) {
        this.Position = pos; 
        setBounds(100, 100, 450, 300);
        setTitle("Alert"); 
        setResizable(false);
        setFocusable(false);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(130, 130, 218, 120);
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
            Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
            int x = (int) rect.getMaxX() - this.getWidth();
            int y = (int) rect.getMaxY() - this.getHeight();
            x = x - 100; 
            y = y - pos; 
            setLocation(x,y); 
            setUndecorated(true);
            contentPane = new JPanel();
            contentPane.setBackground(new Color(255, 69, 0));
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null); 
            this.message = new JLabel("<html>Starting Headsup<br>Contacting server...</html>"); 
            message.setHorizontalAlignment(SwingConstants.CENTER);
            message.setForeground(new Color(255,255,255));
            message.setFont(new Font("Tahoma", Font.PLAIN, 14));
            message.setBounds(10,11,198,98);
            contentPane.add(message); 

    }

然后我只在Jframe上调用.setVisible(true),这就是它窃取键盘输入的时间。

我想要的是该窗口在用户屏幕上闪烁而不会中断他们的工作。

谢谢

编辑:查看图像可能会有所帮助。这是程序运行时的外观。我之所以使用JFrame,是因为它们具有删除窗口装饰以及对它们进行着色,定位和调整大小的功能。我所做的任何更改,基本输出仍将需要如下所示。 https://www.dropbox.com/s/x1z3isdln83stnm/headsup.png?dl=0

谢谢

1 个答案:

答案 0 :(得分:1)

对于警报,我认为SystemTray类会更好:

  SystemTray st = SystemTray.getSystemTray();
  TrayIcon icon = new TrayIcon(...);
  icon.displayMessage(...)

您将在the system tray documentation

中找到更多信息