我有一个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"显示在按钮中。
我该如何解决这个问题?
答案 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 提出建议。