我已经用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
谢谢
答案 0 :(得分:1)
对于警报,我认为SystemTray类会更好:
SystemTray st = SystemTray.getSystemTray();
TrayIcon icon = new TrayIcon(...);
icon.displayMessage(...)
中找到更多信息