在JButton中显示一个图标并隐藏它

时间:2014-09-21 20:27:04

标签: java swing jbutton imageicon thread-sleep

我有一个JButton,我希望当我点击此按钮在其中显示一个图标,然后在3秒后隐藏图标并在按钮中显示文字。

在动作监听器中我尝试了这段代码:

JButton clickedButton = (JButton) e.getSource();
clickedButton.setIcon(new ImageIcon(images.get(clickedButton.getName())));
try {
    Thread.sleep(3000);                
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}
clickedButton.setText("x");
clickedButton.setIcon(null);

问题是,当我点击按钮时,程序会阻塞3分钟,然后是文本" x"显示在按钮中。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

不要在Swing事件线程上调用Thread.sleep(...),因为这会冻结线程并使用它来激活GUI。而是使用Swing Timer。例如:

final JButton clickedButton = (JButton) e.getSource();
clickedButton.setIcon(new ImageIcon(images.get(clickedButton.getName())));

new Timer(3000, new ActionListener(){
  public void actionPerformed(ActionEvent evt) {
    clickedButton.setText("x");
    clickedButton.setIcon(null);   
    ((Timer) evt.getSource()).stop(); 
  }
}).start();

答案 1 :(得分:1)

根据建议,您不需要使用 Thread.Sleep 使用Swing Timer来执行此任务。

 // Declare button and assign an Icon.
 Icon icon = new ImageIcon("search.jpg");
 JButton button = new JButton(icon);    
 ChangeImageAction listener = new ChangeImageAction(button);
 button.addActionListener(listener);

单击 ChangeImageAction 类将在单击按钮时执行必要的操作。 单击按钮时会触发一个操作,在此操作中,我们将调用Timer的Action侦听器,我们将按钮的图标设置为null,并为按钮指定标题。

class ChangeImageAction implements ActionListener {

    private JButton button;

    public ChangeImageAction(JButton button) {
        this.button = button;
    }

    ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            button.setIcon(null);
            button.setText("Button");
        }
    };

    @Override
    public void actionPerformed(ActionEvent arg0) {
        Timer timer = new Timer( 3000 , taskPerformer);
        timer.setRepeats(false);
        timer.start();
    }

}

P.S:我第一次尝试使用计时器感谢 @Hovercraft Full Of Eels 提出建议。