Java 在 2 秒内闪烁 JButton

标签 java swing jbutton background-color blink

我希望程序在按钮闪烁时等待 2 秒。 我有闪烁按钮的代码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;

public class a
{
    static JFrame frame = new JFrame();
    static JButton button = new JButton("Hello");

    public static void main(String[] args) {
        frame.add(button);
        frame.pack();
        frame.setVisible(true);
        blinking();   //this is the blinking part
        //this is where the waiting 2 seconds should be
        JOptionPane.showMessageDialog(null,"Popup message", "Title", JOptionPane.PLAIN_MESSAGE);
        //rest of the code of my program
    }

    private void blinking() {
        button.setOpaque(true);
        Timer blinkTimer = new Timer(500, new ActionListener() {
            boolean on=false;
            public void actionPerformed(ActionEvent e) {
                // blink the button background on and off
                button.setBackground( on ? Color.YELLOW : null);
                on = !on;
            }
        });
        blinkTimer.start();
    }
}

我希望程序在 2 秒内闪烁,然后打开 JOptionPane。它正在做的是打开 JOptionPane 而无需等待 2 秒。 我已经尝试使用 Thread.sleep(2000) 进行等待,但它似乎不起作用,在 2000 毫秒的等待时间内按钮没有闪烁。
有什么建议么?

注意: 我无法将 JOptionPane 移出 main()。

最佳答案

使用您已有的 Timer 来帮助您确定 2 秒何时结束,您可以通过在 Timer 内部计算调用 actionPerformed 方法的次数来实现这一点。当它被调用 4 次(2 秒)时,停止 Timer。很简单:

Timer blinkTimer = new Timer(500, new ActionListener() {
    private int count = 0;
    private int maxCount = 4;
    private boolean on = false;

    public void actionPerformed(ActionEvent e) {
        if (count >= maxCount) {
            button.setBackground(null);
            ((Timer) e.getSource()).stop();
        } else {
            button.setBackground( on ? Color.YELLOW : null);
            on = !on;
            count++;
        }
    }
});
blinkTimer.start();

你还告诉我你想在这个闪烁期间以某种方式暂停某些程序的执行,为此我建议你创建一个方法,比如 enableExecution(boolean)为你做这件事,你在启动计时器之前打电话,当计时器结束时你再次打电话,比如:

Timer blinkTimer = new Timer(500, new ActionListener() {
    private int count = 0;
    private int maxCount = 4;
    private boolean on = false;

    public void actionPerformed(ActionEvent e) {
        if (count >= maxCount) {
            button.setBackground(null);
            ((Timer) e.getSource()).stop();
            enableExecution(true);   //  ***** re-enable execution of whatever *****

        } else {
            button.setBackground( on ? Color.YELLOW : null);
            on = !on;
            count++;
        }
    }
});

enableExecution(false);   //  ***** disable execution of whatever *****
blinkTimer.start();

编辑
关于您编辑的代码,我仍然认为最好的解决方案是再次调用从您的计时器中显示对话框的代码。如果您的问题是调用计时器的类没有在对话框中适当显示所需的信息,请考虑将此信息传递给该类。例如:

import java.awt.Color;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class BetterA extends JPanel {
   private static final int TIMER_DELAY = 500;
   private JButton button = new JButton("Hello");

   // information needed by the dialog:
   private String message;
   private String title;

   public BetterA(String message, String title) {
      add(button);
      blinking();

      // set the dialog information
      this.message = message;
      this.title = title;
   }

   private void blinking() {
      button.setOpaque(true);
      Timer blinkTimer = new Timer(TIMER_DELAY, new ActionListener() {
         private int count = 0;
         private int maxTime = 2000;
         private boolean on = false;

         public void actionPerformed(ActionEvent e) {
            if (count * TIMER_DELAY >= maxTime) {
               button.setBackground(null);
               ((Timer) e.getSource()).stop();
               Window win = SwingUtilities.getWindowAncestor(BetterA.this);
               JOptionPane.showMessageDialog(win, message, title,
                     JOptionPane.PLAIN_MESSAGE);
            } else {
               button.setBackground(on ? Color.YELLOW : null);
               on = !on;
               count++;
            }
         }
      });
      blinkTimer.start();
   }

   private static void createAndShowGui() {
      String myMessage = "Popup message";
      String myTitle = "Some Title";

      BetterA mainPanel = new BetterA(myMessage, myTitle);

      JFrame frame = new JFrame("BetterA");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

编辑2

另一种选择是使用 Swing 的固有 PropertyChangeListener 支持。例如:

import java.awt.Color;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class BetterA2 extends JPanel {
   private static final int TIMER_DELAY = 500;
   private static final int MAX_TIME = 2000;
   private static final String READY = "ready";
   private JButton button = new JButton("Hello");

   public BetterA2() {
      add(button);
      blinking();
   }

   private void blinking() {
      button.setOpaque(true);
      Timer blinkTimer = new Timer(TIMER_DELAY, new ActionListener() {
         private int count = 0;
         private boolean on = false;

         public void actionPerformed(ActionEvent e) {
            if (count * TIMER_DELAY >= MAX_TIME) {
               button.setBackground(null);
               ((Timer) e.getSource()).stop();

               // !!!
               firePropertyChange(READY, READY, null);
            } else {
               button.setBackground(on ? Color.YELLOW : null);
               on = !on;
               count++;
            }
         }
      });
      blinkTimer.start();
   }

   private static void createAndShowGui() {
      final BetterA2 mainPanel = new BetterA2();
      mainPanel.addPropertyChangeListener(BetterA2.READY,
            new PropertyChangeListener() {

               @Override
               public void propertyChange(PropertyChangeEvent evt) {
                  JOptionPane.showMessageDialog(mainPanel, "Popup message",
                        "Title", JOptionPane.PLAIN_MESSAGE);
               }
            });

      JFrame frame = new JFrame("BetterA");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于Java 在 2 秒内闪烁 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036495/

相关文章:

java - 如何在初始化后将Java对象设置为final

java - play项目在Netbeans中运行失败

java - 在 JFrame 中添加图像时出现错误输出

java - 井字游戏 java mouseListener

java - 我不知道如何将 Jbutton 返回到调用它的前一个方法

java - 单击 JButton 设置文本样式后保持选择

java - 以编程方式构建约束布局

java - JLabel 在 JFrame 中不显示任何内容

java - 按下 JButton 时尝试更改图像

java - JLabel.toString 返回什么?