【问题标题】:Mouse Coordinate Finder GUI won't run correctly鼠标坐标查找器 GUI 无法正确运行
【发布时间】:2015-12-16 05:53:33
【问题描述】:

我想用 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;
                }
                }
        }

}

【问题讨论】:

标签: java jframe mouse


【解决方案1】:

您正在阻塞事件调度线程。 EDT 负责处理事件和绘制请求并响应用户输入。当您的 whileActionListener 中运行时,EDT 无法处理任何新事件,您的程序将“挂起”

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

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

还有一个可运行的例子,看看here

【讨论】:

  • 除了您的有用答案之外,我犯了哪些(如果有的话)简单的初学者错误应该更正?我应该更改任何冗余或不正确的陈述吗?
  • 其他然后阻塞 EDT,这是您的主要问题,通常不鼓励从 JFrame 本身扩展,您将自己锁定在一个用例中,JFrame 有足够复杂的它自己的结构,你并没有真正增加任何价值。 JPanel 可能是一个更好的起点。您还应该从 EDT 的上下文中启动 UI,有关更多详细信息,请参阅 Initial Threads,这将有助于防止线程锁和其他问题的任何可能问题
猜你喜欢
  • 2019-05-09
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2019-10-14
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多