鼠标坐标查找器 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 负责处理事件和绘制请求并响应用户输入。虽然您的 while
在 ActionListener
中是 运行,但 EDT 无法处理任何新事件,您的程序将 "hang"
查看 Concurrency in Swing 了解更多详情。
看看Worker Threads and SwingWorker
和 How to use Swing Timers 一些解决方案的想法。
对于可运行的示例,请查看 here
我想用 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 负责处理事件和绘制请求并响应用户输入。虽然您的 while
在 ActionListener
中是 运行,但 EDT 无法处理任何新事件,您的程序将 "hang"
查看 Concurrency in Swing 了解更多详情。
看看Worker Threads and SwingWorker 和 How to use Swing Timers 一些解决方案的想法。
对于可运行的示例,请查看 here