Java 计时器达到0时闪烁
导入库Java 计时器达到0时闪烁,java,timer,flicker,Java,Timer,Flicker,导入库 public class Countdown1 extends Applet implements Runnable { // getting user input String input = JOptionPane.showInputDialog("Enter seconds: "); // converting string to integer int counter = Integer.parseInt(input); Thread countd
public class Countdown1 extends Applet implements Runnable {
// getting user input
String input = JOptionPane.showInputDialog("Enter seconds: ");
// converting string to integer
int counter = Integer.parseInt(input);
Thread countdown;
public void start() {
countdown = new Thread(this);
countdown.start();
}
// executed by thread
public void run() {
Timer timer;
timer = new Timer(1000, new ActionListener() /* counting down time inputted */ {
public void actionPerformed(ActionEvent evt) {
if (counter > 0) {
counter--;
// repainting each second
repaint();
}
}
});
// timer started
timer.start();
}
public void paint(Graphics g) {
//painting text and time
g.setFont(new Font("Times New Roman", Font.BOLD, 35));
g.drawString("Seconds: " + String.valueOf(counter), 260, 210);
setBackground(Color.orange);
setForeground(Color.magenta);
// change background to cyan when timer reaches 0
if (counter == 0) {
setBackground(Color.cyan);
}
}
}
问题不在于你的
计时器
(尽管我确实怀疑是否需要在单独的线程中启动它),问题在于重写绘制
像Applet
这样的顶级容器不是双缓冲的,这意味着每个绘制动作都会被发送到底层的Graphics
设备
现在你可以通过一些双缓冲过程来解决这个问题,或者你可以
- 改为从
扩展JApplet
- 创建一个从
扩展而来的自定义组件,并替代它的JPanel
方法,将自定义绘制移动到此方法paintComponent
- 将此组件添加到小程序中
paint
方法中调用setForeground
或setBackground
。事实上,您应该避免从任何paint
方法中调用任何可能调用repaint
的方法
看看
我非常确定stringinput=JOptionPane.showInputDialog(“输入秒:”)这是个坏主意。相反,您应该在UI中提供某种控件或选项来更改此值
粗略示例
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Countdown1 extends JApplet {
@Override
public void init() {
add(new CounterPane());
}
public class CounterPane extends JPanel {
String input = JOptionPane.showInputDialog("Enter seconds: ");
int counter = Integer.parseInt(input);
public CounterPane() {
Timer timer;
timer = new Timer(1000, new ActionListener() /* counting down time inputted */ {
public void actionPerformed(ActionEvent evt) {
System.out.println(counter);
if (counter > 0) {
counter--;
setBackground(Color.orange);
setForeground(Color.magenta);
if (counter <= 0) {
setBackground(Color.cyan);
}
repaint();
}
}
});
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("Times New Roman", Font.BOLD, 35));
g.setColor(getForeground());
g.drawString("Seconds: " + String.valueOf(counter), 260, 210);
}
}
}
导入java.awt.Color;
导入java.awt.Font;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JApplet;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类倒计时1扩展JApplet{
@凌驾
公共void init(){
添加(新的对应物());
}
公共类反作用扩展JPanel{
字符串输入=JOptionPane.showInputDialog(“输入秒:”);
int计数器=整数.parseInt(输入);
公众反对者(){
定时器;
计时器=新计时器(1000,新ActionListener()/*输入的倒计时时间*/{
已执行的公共无效操作(操作事件evt){
系统输出打印项次(计数器);
如果(计数器>0){
计数器--;
挫折背景(橙色);
设置前景(颜色为洋红色);
如果(反希望它能帮你一把;)这很晚了,但是当我从JApplet扩展到Applet而不是Applet时,我的背景颜色变回白色,计时器在前面的数字上重新绘制。我收到一个错误,它说“找不到符号方法paintComponent(java.awt.Graphics)”这是因为在您的示例中,您正在覆盖paint
,我建议您不要这样做。JApplet
没有paintComponent
方法。相反,您应该创建一个从JPanel
扩展的自定义组件,并将所有自定义绘制放在其中,然后将其添加到appletI中。我认为我需要漫游在运行之前。我最近开始使用Java,我对它的了解仅限于您面前的内容。我根本不理解您的意思。不过,我非常重视您的帮助。