目前,我正在开发ATM模拟,主要有三种功能,即“显示余额”,“取款”和“存款”。由于它只是一个模拟,没有自动提款机,因此我在客户想要存入账户时分配了一笔随机金额。
说到我的问题,当用户点击存款时,该屏幕上有一个标签。我希望该标签写入“数钱”2秒,然后显示实际数量,这是随机生成的。
我的问题是第一部分。如何让标签写入“计数”2秒钟?
感谢您的回答和时间。
答案 0 :(得分:4)
Swing为此类事件提供了timer,请查看documentation。例如:
label.setText("Counting");
Timer timer = new Timer(2000, e -> label.setText("Done"));
timer.setRepeats(false);
timer.start();
作为一名评论者指出它是javax.swing.Timer
而不是java.util.Timer
,因为前者在EDT上执行它的行动。
答案 1 :(得分:1)
假设您已经创建了一个选择窗格(JPanel,JDesktopPane等)并为Deposit按钮创建了类似的JButton,并为要显示的标签创建了JLabel" Counting Money",您需要创建一个Thread
,它将与您程序中的其他代码并行运行,这样您的程序就不必等待计数过程,直到您可以执行其他操作。因此,您将创建一个Thread
对象,如下所示,并使用代码Calendar.getInstance().getTimeInMillis()
获取当前时间并设置long
变量以保存开始时间。然后使用while
循环,您将继续检查开始时间和当前时间之间的差异,以查看是否已经过了2秒。将此差异保存在循环内的另一个long
变量中,并使循环检查其值是否超过2000毫秒(2秒)。当while循环超过2秒时,Thread
可以继续执行下一行代码,将标签设置为空(您可以将文本更改为您想要的任何内容)。在此之后Thread
停止。您的代码应如下所示:
JLabel lblCount = new JLabel("");
lblCount.setBounds(92, 28, 243, 90);
windowPane.add(lblClock);
JButton btnDeposit = new JButton("Deposit Money");
btnDeposit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lblCount.setText("Counting Money.....Please Wait");
long start = Calendar.getInstance().getTimeInMillis();
Thread timer = new Thread(){
public void run()
{
long time = Long.valueOf(0);
while(time < Long.valueOf(2))
{
time = (Calendar.getInstance().getTimeInMillis() - start)/1000;
}
lblCount.setText("");
}
};
}
});
btnDeposit.setBounds(78, 175, 118, 53);
windowPane.add(btnDeposit);
答案 2 :(得分:0)
public void crono() {
TimerTask tarea = new TimerTask() {
@Override
public void run() {
int ok = 0;
if (actualTime < maxTime * 1000) {
ok = 1;
//because its in miliseconds
actualTime = actualTime + 1000;
}
switch (ok) {
case 1:
int displayTime= actualTime/ 1000;
label.setText(Integer.toString(displayTime));
break;
//if actual is over maxtime
case 0:
label.setText("TIME IS UP");
break;
default:
break;
}
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(tarea, 0, 1000);
//the first argument will be the task, the second the starting time, and the final one is //the period, in this case it will be one second
}
答案 3 :(得分:-1)
尝试使用线程。
Thread t;
t = new Thread(){
@Override
public void run(){
label.setText("counting...");
Thread.sleep(2000);//Time in Milliseconds
label.setText("Display what you want.");
}
}
t.start();