【发布时间】:2012-06-23 04:52:38
【问题描述】:
我有一个 JTextField,如果它的内容无效,它会被清除。我希望背景以红色闪烁一两次,以向用户表明这已经发生。我试过了:
field.setBackground(Color.RED);
field.setBackground(Color.WHITE);
但它在如此短暂的时间内是红色的,以至于不可能被看到。有什么建议吗?
【问题讨论】:
标签: java swing colors jtextfield
我有一个 JTextField,如果它的内容无效,它会被清除。我希望背景以红色闪烁一两次,以向用户表明这已经发生。我试过了:
field.setBackground(Color.RED);
field.setBackground(Color.WHITE);
但它在如此短暂的时间内是红色的,以至于不可能被看到。有什么建议吗?
【问题讨论】:
标签: java swing colors jtextfield
你需要扩展公共类Timer 这样做:
private class FlashTask extends TimerTask{
public void run(){
// set colors here
}
}
您可以设置Timer 以您喜欢的任何间隔执行以创建闪烁效果
来自文档:
public void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定任务以重复固定速率执行,在指定延迟后开始。
【讨论】:
几乎由 eric 得出的正确解决方案是使用 Swing Timer,因为 Timer 的 ActionListener 中的所有代码都将在 Swing 事件线程上调用,这可以防止发生间歇性和令人沮丧的错误。例如:
public void flashMyField(final JTextField field, Color flashColor,
final int timerDelay, int totalTime) {
final int totalCount = totalTime / timerDelay;
javax.swing.Timer timer = new javax.swing.Timer(timerDelay, new ActionListener(){
int count = 0;
public void actionPerformed(ActionEvent evt) {
if (count % 2 == 0) {
field.setBackground(flashColor);
} else {
field.setBackground(null);
if (count >= totalCount) {
((Timer)evt.getSource()).stop();
}
}
count++;
}
});
timer.start();
}
它会通过flashMyField(someTextField, Color.RED, 500, 2000);调用
警告:代码尚未编译或测试。
【讨论】:
Timer 以及为什么看不到红色的原因与我在this answer 中描述的大致相同。
setBackground( Color.WHITE ) 这不是某些 L&F 的默认背景。