Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计时器达到0时闪烁_Java_Timer_Flicker - Fatal编程技术网

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(“输入秒:”)
粗略示例

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,我对它的了解仅限于您面前的内容。我根本不理解您的意思。不过,我非常重视您的帮助。