是否可以在 Swing 应用程序中间创建一个暂停?
Is it possible to create a pause in the middle of Swing application?
我正在从事一个涉及通过从物理卡读取字符串进行访问的项目,以下代码简化了我程序的要点,但是当我尝试在用户之后暂停几秒钟时刷了他的卡,出了点问题,行为不是我需要的,程序暂停但颜色的窗格没有改变,标签也没有改变。
有什么建议吗?
这是代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class B2 extends JFrame implements ActionListener {
JLabel lbl;
JButton btn;
JTextField jtf;
String password = "123";
public B2() {
super("");
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setLayout(null);
this.setVisible(true);
setBounds(0,0,480, 250);
getContentPane().setBackground(Color.cyan);
btn = new JButton("OK");
lbl = new JLabel("Enter your password");
jtf = new JTextField(25);
btn.addActionListener(this);
lbl.setBounds(50, 100, 200, 25);
btn.setBounds(150, 180, 110, 25);
jtf.setBounds(20, 180, 110, 25);
getContentPane().add(btn);
getContentPane().add(lbl);
getContentPane().add(jtf);
}
public void actionPerformed(ActionEvent e) {
if(jtf.getText().equals(password)) {
getContentPane().setBackground(Color.green);
lbl.setText("Welcome");
} else {
getContentPane().setBackground(Color.red);
lbl.setText("Access Denied");
}
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
getContentPane().setBackground(Color.cyan);
lbl.setText("Enter your password");
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
B2 frame = new B2();
}
});
}
}
将最后两行放在评论中
//getContentPane().setBackground(Color.cyan);
//lbl.setText("Enter your password");
只有执行操作才会看到效果。当执行 actionPerformed() 时。希望你找到了解决方案
使用 Thread.sleep()
可防止 Swing 在暂停完成之前进行重绘。所以它会改变颜色并同时变回它,你不会看到效果。
请尝试使用 Timer
。将此添加到您的代码中,它将起作用:
if(jtf.getText().equals(password)) {
getContentPane().setBackground(Color.green);
lbl.setText("Welcome");
} else {
getContentPane().setBackground(Color.red);
lbl.setText("Access Denied");
}
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getContentPane().setBackground(Color.cyan);
lbl.setText("Enter your password");
}
});
timer.setRepeats(false);
timer.start();
我正在从事一个涉及通过从物理卡读取字符串进行访问的项目,以下代码简化了我程序的要点,但是当我尝试在用户之后暂停几秒钟时刷了他的卡,出了点问题,行为不是我需要的,程序暂停但颜色的窗格没有改变,标签也没有改变。
有什么建议吗?
这是代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class B2 extends JFrame implements ActionListener {
JLabel lbl;
JButton btn;
JTextField jtf;
String password = "123";
public B2() {
super("");
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setLayout(null);
this.setVisible(true);
setBounds(0,0,480, 250);
getContentPane().setBackground(Color.cyan);
btn = new JButton("OK");
lbl = new JLabel("Enter your password");
jtf = new JTextField(25);
btn.addActionListener(this);
lbl.setBounds(50, 100, 200, 25);
btn.setBounds(150, 180, 110, 25);
jtf.setBounds(20, 180, 110, 25);
getContentPane().add(btn);
getContentPane().add(lbl);
getContentPane().add(jtf);
}
public void actionPerformed(ActionEvent e) {
if(jtf.getText().equals(password)) {
getContentPane().setBackground(Color.green);
lbl.setText("Welcome");
} else {
getContentPane().setBackground(Color.red);
lbl.setText("Access Denied");
}
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
getContentPane().setBackground(Color.cyan);
lbl.setText("Enter your password");
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
B2 frame = new B2();
}
});
}
}
将最后两行放在评论中
//getContentPane().setBackground(Color.cyan);
//lbl.setText("Enter your password");
只有执行操作才会看到效果。当执行 actionPerformed() 时。希望你找到了解决方案
使用 Thread.sleep()
可防止 Swing 在暂停完成之前进行重绘。所以它会改变颜色并同时变回它,你不会看到效果。
请尝试使用 Timer
。将此添加到您的代码中,它将起作用:
if(jtf.getText().equals(password)) {
getContentPane().setBackground(Color.green);
lbl.setText("Welcome");
} else {
getContentPane().setBackground(Color.red);
lbl.setText("Access Denied");
}
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getContentPane().setBackground(Color.cyan);
lbl.setText("Enter your password");
}
});
timer.setRepeats(false);
timer.start();