Java 在倒计时计时器上使用windowFocusListener
我正在尝试制作一个只有在窗口位于屏幕上方时才运行的倒计时计时器 我试过这个:Java 在倒计时计时器上使用windowFocusListener,java,swing,window,focus,Java,Swing,Window,Focus,我正在尝试制作一个只有在窗口位于屏幕上方时才运行的倒计时计时器 我试过这个: import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swin
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TimerVisible extends JFrame implements WindowFocusListener{
static TimerVisible frame = new TimerVisible("chrono",2,1,3);//I set a random time
JTextArea display;
private Counter counter;
public static void main(String[] args) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addComponentsToPane();
frame.pack();
frame.setVisible(true);
}
private void addComponentsToPane() {
display = new JTextArea();
display.setEditable(true);
JScrollPane scrollPane = new JScrollPane(display);
scrollPane.setPreferredSize(new Dimension(500, 450));
getContentPane().add(scrollPane, BorderLayout.CENTER);
addWindowFocusListener(this);
}
public TimerVisible(String name, int hours, int minutes, int secondes) {
super(name);
counter=new Counter(hours, minutes, secondes); //Counter is in secondes but is created with hours, minutes and seconds
}
public void windowGainedFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowGainFocus.");
try{
while(counter.getCounter()!=0){
Thread.sleep(1000);
displayMessage(counter.toString());
counter.decrement();
}
}
catch(InterruptedException exc){
System.exit(-1);
}
}
public void windowLostFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowLostFocus.");
}
private void displayMessage(String msg) {
display.append(msg+"\n");
System.out.println(msg);
}
}
当我运行这个程序时,它在终端上显示消息和倒计时,而不是窗口,但是如果我在注释下设置while loop
,它会在窗口上正确显示消息。有人知道我为什么会有这种不同吗
谢谢您的while循环正在Swing事件线程上运行,阻塞它并阻止它绘制到GUI或与用户交互。改用a。请注意,使用Swing计时器时,不会有while循环,而是会重复调用actionPerformed,直到停止计时器 类似这样的东西可能很快就能工作(代码未经测试)
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowEvent;
导入java.awt.event.WindowFocusListener;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.Timer;
公共类TimerVisible扩展JFrame实现WindowFocusListener{
专用静态最终int定时器_延迟=1000;
静态TimerVisible帧=新TimerVisible(“chrono”,2,1,3);//我设置了一个随机时间
区域显示;
私人柜台;
计时器=空;
公共静态void main(字符串[]args){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addComponentsToPane();
frame.pack();
frame.setVisible(true);
}
私有void addComponentsToPane(){
显示=新的JTextArea();
display.setEditable(true);
JScrollPane scrollPane=新的JScrollPane(显示);
scrollPane.setPreferredSize(新维度(500450));
getContentPane().add(滚动窗格,BorderLayout.CENTER);
addWindowFocusListener(此);
}
公共TimerVisible(字符串名称、整数小时、整数分钟、整数秒){
超级(姓名);
计数器=新计数器(小时、分钟、秒);//计数器以秒为单位,但以小时、分钟和秒为单位创建
}
公共无效windowGainedFocus(WindowEvent e){
displayMessage(“WindowFocusListener方法名为:WindowGaInfo.”);
if(timer!=null&&timer.isRunning()){
返回;
}
计时器=新计时器(计时器延迟,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(counter.getCounter()谢谢,它正在工作,我现在理解swing定时器了。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
public class TimerVisible extends JFrame implements WindowFocusListener{
private static final int TIMER_DELAY = 1000;
static TimerVisible frame = new TimerVisible("chrono",2,1,3);//I set a random time
JTextArea display;
private Counter counter;
Timer timer = null;
public static void main(String[] args) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addComponentsToPane();
frame.pack();
frame.setVisible(true);
}
private void addComponentsToPane() {
display = new JTextArea();
display.setEditable(true);
JScrollPane scrollPane = new JScrollPane(display);
scrollPane.setPreferredSize(new Dimension(500, 450));
getContentPane().add(scrollPane, BorderLayout.CENTER);
addWindowFocusListener(this);
}
public TimerVisible(String name, int hours, int minutes, int secondes) {
super(name);
counter=new Counter(hours, minutes, secondes); //Counter is in secondes but is created with hours, minutes and seconds
}
public void windowGainedFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowGainFocus.");
if (timer != null && timer.isRunning()) {
return;
}
timer = new Timer(TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (counter.getCounter() <= 0) {
timer.stop();
} else {
displayMessage(counter.toString());
counter.decrement();
}
}
});
timer.start();
}
public void windowLostFocus(WindowEvent e) {
displayMessage("WindowFocusListener method called: windowLostFocus.");
}
private void displayMessage(String msg) {
display.append(msg+"\n");
System.out.println(msg);
}
}