Java 鼠标坐标查找器GUI赢得';我跑不好
我想用JFrame制作一个程序,允许您启动和停止JLabel,使其不被鼠标光标的最新坐标更新。我不知道我做错了什么。请帮忙,要有礼貌。我是Java新手,所以我忍不住犯了什么愚蠢的错误 代码如下:Java 鼠标坐标查找器GUI赢得';我跑不好,java,jframe,mouse,Java,Jframe,Mouse,我想用JFrame制作一个程序,允许您启动和停止JLabel,使其不被鼠标光标的最新坐标更新。我不知道我做错了什么。请帮忙,要有礼貌。我是Java新手,所以我忍不住犯了什么愚蠢的错误 代码如下: import java.awt.* ; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class PrintPos extends JFram
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负责处理事件和绘制请求,并响应用户输入。当您的
正在ActionListener
中运行时,EDT无法处理任何新事件,您的程序将“挂起”
请查看以了解更多详细信息
看看
以及一些解决方案的想法
对于一个可运行的示例,请看一看您正在阻止事件调度线程。EDT负责处理事件和绘制请求,并响应用户输入。当您的正在ActionListener
中运行时,EDT无法处理任何新事件,您的程序将“挂起”
请查看以了解更多详细信息
看看
以及一些解决方案的想法
对于一个可运行的示例,请查看您正在阻止事件调度线程,查看更多详细信息和一些解决方案的想法,对于一个可运行的示例,请查看您正在阻止事件调度线程,查看更多详细信息和一些解决方案和可运行示例的想法,看看除了你有用的答案之外,我还犯了哪些(如果有的话)简单的初学者错误需要纠正?我应该更改任何冗余或不正确的语句吗?除了阻止EDT(这是您的主要问题)之外,通常不鼓励从JFrame
本身扩展,您将自己锁定在一个用例中,JFrame
本身就有一个足够复杂的结构,并且您没有真正增加任何价值JPanel
可能是一个更好的起点。您还应该在EDT的上下文中启动UI,有关更多详细信息,请参阅,这将有助于防止线程锁和其他问题出现任何可能的问题。除了您的有用答案之外,我犯了哪些(如果有)简单的初学者错误需要纠正?我应该更改任何冗余或不正确的语句吗?除了阻止EDT(这是您的主要问题)之外,通常不鼓励从JFrame
本身扩展,您将自己锁定在一个用例中,JFrame
本身就有一个足够复杂的结构,并且您没有真正增加任何价值JPanel
可能是一个更好的起点。您还应该在EDT的上下文中启动UI,有关更多详细信息,请参阅,这将有助于防止任何可能的线程锁问题和其他问题