Как остановить Jframe от кражи ввода с клавиатуры - PullRequest
1 голос
/ 11 октября 2019

Я написал программу на Java, которая проверяет restAPI каждые 8 ​​секунд и, если обнаруживает изменение состояния, отображает небольшое предупреждение на экране в нижнем углу. Предупреждение предназначено для информирования пользователя о критической ситуации, но не прерывания его работы. Моя проблема заключается в том, что когда срабатывает Alert и JFrame становится видимым, он крадет ввод с клавиатуры. Поэтому, пока он мигает, если пользователь хочет продолжить работу в другом приложении, ему необходимо постоянно нажимать на это приложение.

Я использую setVisible на JFrame (меняя его с false на true и обратно), чтобы создать эффект «мигания». Каждый раз, когда JFrame.setVisible имеет значение true, Windows автоматически фокусирует ввод с клавиатуры на предупреждение.

Я попытался добавить setFocusable (false) при инициализации JFrame, но, похоже, это не имеет никакого эффекта.

Вот как я инициализирую 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); 

    }

, а затем я просто вызываю .setVisible (true) на Jframe, и тогда он крадет ввод с клавиатуры.

Мне бы хотелось, чтобы окно мигало на экране пользователя, не прерывая их работу.

Спасибо

РЕДАКТИРОВАТЬ: Может быть полезно увидеть изображение. Так выглядит программа при запуске. Я использую JFrames из-за их способности убирать художественные оформления окна и окрашивать, размещать и изменять их размер. Любые изменения, которые я делаю, основной вывод все равно должен выглядеть следующим образом. https://www.dropbox.com/s/x1z3isdln83stnm/headsup.png?dl=0

Спасибо

1 Ответ

1 голос
/ 11 октября 2019

Для предупреждений класс SystemTray был бы лучше, я думаю:

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

Более подробную информацию вы найдете в документации в системном трее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...