0

我有一个 JTextField,如果它有无效的内容,它就会被清除。我希望背景以红色闪烁一两次,以向用户表明这已经发生。我努力了:

field.setBackground(Color.RED);
field.setBackground(Color.WHITE);

但它在如此短暂的时间内是红色的,以至于不可能被看到。有小费吗?

4

2 回答 2

7

几乎由 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);

警告:代码既没有经过编译也没有经过测试。

于 2012-06-21T02:38:27.810 回答
2

您需要扩展公共类Timer 这样做:

private class FlashTask extends TimerTask{
    public void run(){
       // set colors here
    }
}

您可以设置Timer以您喜欢的任何间隔执行以创建闪烁效果

从文档:

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

安排指定任务以重复固定速率执行,在指定延迟后开始。

于 2012-06-21T00:27:25.430 回答