【发布时间】: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;
}
}
}
}
【问题讨论】:
-
您正在阻塞事件调度线程,请查看Concurrency in Swing 了解更多详细信息,查看Worker Threads and SwingWorker 和How to use Swing Timers 了解解决方案的一些想法和一个可运行的示例,看看@ 987654324@