Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java闪烁按钮持续2秒_Java_Swing_Jbutton_Background Color_Blink - Fatal编程技术网

Java闪烁按钮持续2秒

Java闪烁按钮持续2秒,java,swing,jbutton,background-color,blink,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)

我希望程序在闪烁按钮时等待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秒钟内闪烁,然后打开
作业窗格
。它所做的是打开
作业窗格
,无需等待2秒钟。 我曾尝试使用
线程.sleep(2000)
进行等待,但它似乎不起作用,在2000毫秒的等待时间内,按钮不会闪烁。
有什么建议吗

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

请使用您已经拥有的计时器来帮助您确定2秒何时结束,您可以通过在计时器内计算调用actionPerformed方法的次数来完成此操作。当它被调用4次(2秒)时,停止计时器。很简单:

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();

你还告诉我,你想在这个闪烁期间暂停一些程序的执行,为此,我建议你创建一个方法,比如
enablexecution(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();
         }
      });
   }
}
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();
         }
      });
   }
}

编辑2

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

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();
         }
      });
   }
}
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();
         }
      });
   }
}

谢谢,它停了。但是我想让程序在这2秒钟内什么都不做(只是眨眼),然后继续它的工作execution@dan_san_1当前位置你上面的说法对我来说有点模棱两可。请编辑您的问题,并告诉我们您所说的“
”…让程序什么都不做…”的确切含义。
。在编辑中,考虑告诉我们程序当前正在做什么,而不希望它做什么。我们越能理解你的问题,就越能帮助你。另外,考虑创建并发布一个.dnySauni1:请参阅“编辑回答”。请注意,
enablexecution(…)
方法的详细信息将取决于您的代码和问题的详细信息。我不希望它在闪烁期间暂停,我希望程序在这2秒钟内闪烁。等等2seconds@dan_san_1:同样,您所说的
“…然后继续执行是什么意思。”
。执行什么?请提供以下详细信息,帮助回答您的问题。如果我们能理解你的问题,我们可以帮助你。