日期:2014-05-20  浏览次数:20752 次

新手请教关于线程的一个简单问题
在ATM操作界面那里有这样一个过程,在存款功能里,把钱放进去之后,ATM界面转为显示“正在验钞”字样,过几秒后,再显示“交易正在处理中”,最后再是“交易成功”,我想用两个方法实现这个过程,但是验钞的标签还没显示出来就开始睡眠了,而且直接就显示交易成功界面了,我实在想不出怎么解决,求高手指教。代码如下:
public void checkcash(){
jp.add(Checkmoney);//显示正在验钞标签
Checkmoney.setFont(new Font("",Font.CENTER_BASELINE, 22));
Checkmoney.setBounds(130, 120, 150, 50);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
jp.removeAll();
jp.repaint();
deal();
}


public void deal(){
JLabel jdeal = new JLabel();
jdeal.setIcon(new ImageIcon("d:\\用到的图片\\交易处理.jpg"));
jdeal.setSize(getWidth(), getHeight());
jp.add(jdeal);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
线程 界面 swing

------解决方案--------------------
大概是以下意思:

SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
jp.add(Checkmoney);//显示正在验钞标签
Checkmoney.setFont(new Font("",Font.CENTER_BASELINE, 22));
Checkmoney.setBounds(130, 120, 150, 50);

}
});

具体去学习一下SwingUtilities.invokeLater是干什么用的
------解决方案--------------------
引用:
Quote: 引用:

你上面的程序的问题在于,你调用的sleep方法是在GUI线程里面,也就是负责界面刷新和显示的线程,你让这个线程sleep了,这个线程就没法工作了,而当线程睡醒后会分别将显示验钞过程和验钞结果的代码分别执行完,这个过程是非常快的,肉眼更本看不到,你看到的就是现实验钞结果的界面了

那我应该怎么用SwingUtilities.invokeLater(new Runnable() {....}这段呢??

你应该自己新开一个线程来负责计时,invokelater应该也是在ui线程里的,具体不是很清楚这里,没有看过源码