【问题标题】:Flashing color of a JTextFieldJTextField 的闪烁颜色
【发布时间】:2012-06-23 04:52:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: java swing colors jtextfield


    【解决方案1】:

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

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

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

    来自文档:

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

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

    【讨论】:

    • 这是一个不错的解决方案,但我只希望它闪烁一次。问题更多在于背景设置为红色的时间不够长。
    • 闪烁一次是指改变颜色一秒钟,然后变回来并停留在那里吗?还是只是更改颜色并保持该颜色直到满足条件?
    • “没有足够长的时间设置为红色”您的意思是您需要帮助编辑更改间隔吗?
    • 你的想法是对的,但你的实现是错误的。由于这是一个 Swing 问题,因此原始发帖人绝对不应该使用 java.util.Timer,而是使用 javax.swing.Timer 或 Swing Timer。他们在尊重 Swing 事件线程方面存在很大差异。
    • 你可以在这个example看到额外的努力。
    【解决方案2】:

    几乎由 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 中描述的大致相同。
    • +1 在这个答案中很好地抓住了不调用 setBackground( Color.WHITE ) 这不是某些 L&F 的默认背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多