Javax.swing计时器重复正常,但ActionListener不执行任何操作

时间:2010-01-23 16:39:32

标签: java swing javax.swing.timer

我正在尝试在文本字段中闪烁背景颜色。我的计时器设置如下:

 Flash flash = new Flash();                      //set up timer
 tmr = new javax.swing.Timer(1000, new Flash());
 tmr.addActionListener(flash);
 tmr.setInitialDelay(0);
 tmr.setRepeats(true);
 tmr.start();                 

我的actionListener如下:

 static class Flash implements ActionListener
 {
    public void actionPerformed(ActionEvent evt)
    {
        if (flasher)
        {
            SpreademPanel.historyPnl.NameTxt.setBackground(Color.white);
        }
        else
        {
            SpreademPanel.historyPnl.NameTxt.setBackground(Color.pink);
        }
        flasher = !flasher;
    } //actionPerformed
} //Flash

现在,当我把它放在调试中并按照动作执行时,程序会反复执行闪存并在两个备选项之间切换。但在屏幕上,只有第一个切换 发生。在那之后,虽然闪光灯仍在运转,但没有动作。

这里有什么问题?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

此示例不断改变面板背景颜色的saturation

FlashTest

import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.*;

public class FlashTest extends JPanel {

    private static final Font font = new Font("Serif", Font.PLAIN, 32);
    private static final String s = "Godzilla alert!";

    FlashTest() {
        this.setPreferredSize(new Dimension(256, 96));
        this.setBackground(Color.red);
        Timer t = new Timer(50, new Flash(this));
        t.start();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setFont(font);
        int xx = this.getWidth();
        int yy = this.getHeight();
        int w2 = g.getFontMetrics().stringWidth(s) / 2;
        int h2 = g.getFontMetrics().getDescent();
        g.setColor(Color.black);
        g.drawString(s, xx / 2 - w2, yy / 2 + h2);
    }

    private static class Flash implements ActionListener {

        private final float N = 32;
        private final JComponent component;
        private final Queue<Color> clut = new LinkedList<Color>();

        public Flash(JComponent component) {
            this.component = component;
            for (int i = 0; i < N; i++) {
                clut.add(Color.getHSBColor(1, 1 - (i / N), 1));
            }
            for (int i = 0; i < N; i++) {
                clut.add(Color.getHSBColor(1, i / N, 1));
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            component.setBackground(clut.peek());
            clut.add(clut.remove());
        }
    }

    static public void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(new FlashTest());
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

答案 1 :(得分:4)

这里有几个问题。

第一个显而易见的事情是你似乎在使用可变静力学。这是一个非常糟糕的主意,并指出(并导致!)混乱。在这种特殊情况下,导致的问题之一是共享flasher静态。

Flash flash = new Flash();                      //set up timer
tmr = new javax.swing.Timer(1000, new Flash());
tmr.addActionListener(flash);

我们正在添加两个Flash个动作。通常这会很糟糕,但只会产生一个无法察觉的“错误”。颜色将设置两次。

将这两件事放在一起,我们有两个不间断的动作来执行相同的切换。两个切换。国家不会改变(虽然有重复,财产变化事件等)。

所以,不要使用可变静态,并保持代码清洁。

答案 2 :(得分:3)

tmr = new javax.swing.Timer(1000, flash);

答案 3 :(得分:2)

我尝试了你的代码,它运行正常。

为什么要为SpreademPanel.historyPnl.NameTxt使用静态上下文?

修改

您可能需要重新设计类以在构造函数中传递组件。

private class Flash implements ActionListener
{
    private boolean flasher = false;
    private JComponent component;

    public Flash(JComponent component) {
        this.component = component;
    }

    public void actionPerformed(ActionEvent evt)
    {
        if (flasher)
        {
            component.setBackground(Color.white);
        }
        else
        {
            component.setBackground(Color.pink);
        }
        flasher = !flasher;
    } //actionPerformed
} //Flash

然后使用

初始化它
 Flash flash = new Flash(SpreademPanel.historyPnl.NameTxt);
 Timer tmr = new javax.swing.Timer(1000, flash);
 tmr.start();