我正在尝试在文本字段中闪烁背景颜色。我的计时器设置如下:
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
现在,当我把它放在调试中并按照动作执行时,程序会反复执行闪存并在两个备选项之间切换。但在屏幕上,只有第一个切换 发生。在那之后,虽然闪光灯仍在运转,但没有动作。
这里有什么问题?
提前感谢您的帮助。
答案 0 :(得分:6)
此示例不断改变面板背景颜色的saturation:
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();