鼠标坐标查找器 GUI 不会 运行 正确

Mouse Coordinate Finder GUI won't run correctly

我想用 JFrame 制作一个程序,允许您启动和停止 JLabel 更新为鼠标光标的最新坐标。我不知道我做错了什么。请帮助和尊重。我是 Java 的新人,所以我无法控制自己犯下的愚蠢错误。

代码如下:

import java.awt.* ;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class PrintPos extends JFrame {
    private static final long serialVersionUID = 7526472295622776147L;
    public JButton startBtn;
    public JButton stopBtn;
    public static JLabel posLabelX;
    public static JLabel posLabelY;
    static boolean started=false;

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


    PrintPos() {

        setLayout(new GridLayout(2,2));

        startBtn = new JButton("Start");
        stopBtn = new JButton("Stop");
        posLabelY = new JLabel("X:");
        posLabelX = new JLabel("Y:");

        add(startBtn);
        add(stopBtn);
        add(posLabelX);
        add(posLabelY);

        setSize(200,150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);

        startBtn.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent a)
          {
              started = true;
              while(started) {
                    PointerInfo inf = MouseInfo.getPointerInfo();
                    Point p = inf.getLocation();
                    posLabelX.setText(String.valueOf(p.x));
                    posLabelY.setText(String.valueOf(p.y));
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        return;
                    }
                    }
          }
        });

        stopBtn.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
              started = false;
          }
        });
    }

        public static void getInfo() {
            while(started) {
                PointerInfo inf = MouseInfo.getPointerInfo();
                Point p = inf.getLocation();
                posLabelX.setText(String.valueOf(p.x));
                posLabelY.setText(String.valueOf(p.y));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return;
                }
                }
        }

}

您正在阻塞事件调度线程。 EDT 负责处理事件和绘制请求并响应用户输入。虽然您的 whileActionListener 中是 运行,但 EDT 无法处理任何新事件,您的程序将 "hang"

查看 Concurrency in Swing 了解更多详情。

看看Worker Threads and SwingWorkerHow to use Swing Timers 一些解决方案的想法。

对于可运行的示例,请查看 here