【问题标题】:How do I make my JWindow window always stay focused如何让我的 JWindow 窗口始终保持焦点
【发布时间】:2023-04-02 03:38:01
【问题描述】:

我正在制作一个包含 JWindow 的 java 应用程序。我希望能够跟踪鼠标,而无需用户在转到另一个窗口后单击该窗口。

【问题讨论】:

  • 不确定这与保持窗口聚焦有什么关系,因为您永远无法完成任何工作。如果您想进行“全局”鼠标监控,您可以实现 JNI 解决方案或编写一个 Thread 轮询 MouseInfo 以获取有关 PointerInfo 的信息。但请记住,它在屏幕坐标中返回的鼠标位置;)

标签: java swing jwindow


【解决方案1】:

你的问题有点含糊,为什么你想在鼠标离开JWindow...之后继续处理鼠标...但是

在应用程序外部监控鼠标时,您有两个(基本)选择,您可以使用 JNI/JNA 解决方案,也可以轮询 MouseInfo

下面演示了后者,使用MouseInfojavax.swing.Timer来更新一个标签...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.MouseInfo;
import java.awt.PointerInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MouseWindow {

    public static void main(String[] args) {
        new MouseWindow();
    }

    public MouseWindow() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;

        public TestPane() {
            setLayout(new BorderLayout());
            label = new JLabel();
            label.setFont(label.getFont().deriveFont(48f));
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setVerticalAlignment(JLabel.CENTER);
            add(label);
            updateMouseInfo();

            Timer timer = new Timer(250, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    updateMouseInfo();
                }
            });
            timer.start();
        }

        protected void updateMouseInfo() {
            PointerInfo pi = MouseInfo.getPointerInfo();
            label.setText(pi.getLocation().x + "x" + pi.getLocation().y);
        }            
    }
}

更新

如果支持该平台,您还可以找到Window#setAlwaysOnTop 的帮助以将窗口保持在其他窗口之上

【讨论】:

  • 问:JWindow 不是模态的 A:如果是,那么 OP 需要使用一些 Modality_Types 和 always_on 指示未修饰的 JDialog,
  • @mKorbel 如果 OP 愿意分享更多上下文/细节,我很乐意详细说明,但你是对的。 AlwaysOnTop 会很有用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2015-02-08
相关资源
最近更新 更多