gpt4 book ai didi

java - 如何防止计时器锁定我的小程序?

转载 作者:行者123 更新时间:2023-11-30 06:26:04 26 4
gpt4 key购买 nike

我正在尝试在 Applet 中开发游戏,但遇到了这个问题。我希望显示器在游戏继续之前向用户显示倒计时。但是,倒计时将不会显示,实际上会使 GUI 卡住。如何避免这种情况?下面是一些演示此问题的代码。

编辑:“几乎”下方的代码有效,计时器正在运行,但屏幕只会在按下“开始”按钮时更新为新的计时器值。如何让文本自动刷新?

public class TestApplet extends JApplet implements ActionListener{


final JTextField _displayField = new JTextField("Countdown", 6);
CountDownTimer clock = new CountDownTimer();
JButton jbtnStart = new JButton("Start");

public void addComponentToPane(Container pane) {

JPanel mainPanel = new JPanel();
mainPanel.add(jbtnStart);
mainPanel.add(_displayField);
pane.add(mainPanel);
jbtnStart.addActionListener(this);
}


public void init() {

TestApplet testApplet = new TestApplet();
testApplet.setVisible(true);
testApplet.addComponentToPane(this.getContentPane());
this.setSize(200, 100);

}

public void actionPerformed(ActionEvent e) {

if ( e.getSource() == jbtnStart ){
clock.start(_displayField);
}
}
}

// ********************************************************************************
//********************************************************************************
//********************************************************************************

class CountDownTimer {

private static final int N = 60;
private final ClockListener cl = new ClockListener();
private final Timer t = new Timer(1000, cl);
static int count =0;

public int getCount(){
System.out.println(count);
return count;
}
public void setCount(int n){
count = n;
}

public CountDownTimer() {
t.setInitialDelay(0);
}

public void start(JTextComponent c) {
t.start();
Boolean bool = false;
while ( bool ==false){
c.setText( "Starting new game in... "+ this.getCount() );
bool = ( this.getCount()<10 );
}
}

private class ClockListener implements ActionListener {

public void actionPerformed(ActionEvent e) {
count %= N;
count++;
setCount(count);
}
}
}

最佳答案

您在阻止 EDT 的 ActionListener 中有一个 while 循环。更新显示字段的代码不应在 ActionListener 中。

这段代码应该放在 Timer 类中。然后每当定时器触发时,您只需减去一个并更新显示字段。当计数达到零时,您将停止计时器。

此外,您的 CountDownTimer 不应扩展 JFrame。它只是一个类,与框架无关。

编辑:

这是 Swing Timer 的简单用法:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class TimerTime extends JFrame implements ActionListener
{
JLabel timeLabel;

public TimerTime()
{
timeLabel = new JLabel( new Date().toString() );
getContentPane().add(timeLabel, BorderLayout.NORTH);
}

public void actionPerformed(ActionEvent e)
{
timeLabel.setText( new Date().toString() );
}

public static void main(String[] args)
{
TimerTime frame = new TimerTime();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);

int time = 1000;
javax.swing.Timer timer = new javax.swing.Timer(time, frame);
timer.setInitialDelay(1);
timer.start();
}
}

关于java - 如何防止计时器锁定我的小程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com