我要处置框架3秒后我输入一个密钥。 这里是我的代码:
frame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
Timer t = new Timer(3000, null);
t.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("test");
frame.dispose();
}
});
t.start();
}
}
我可以从控制台看到印刷字符串,但该帧不关闭。 我已经看到了类似的线程,并使用计时器似乎是解决办法,但它不是为我工作。
frame.dispose()
没有保证的广告立即执行。 我发现打电话frame.setVisible(false)
第一有助于加快处置进程。
编辑
此外,你可能想看看使用键绑定 ,而不是关键听众触发您的活动。 主要听众是复杂的,通常不是非常有用(他们需要把重点放在你有,他们往往会消耗事件,这样你就不会看到他们的互动项目)。
编辑2
你的代码的进一步检查后,这个问题似乎是,你需要设置定时不重复(你打电话开始前):
t.setRepeats(false);
这个例子对我的作品 - 让我知道你是否仍然出现问题(如果有的话,请你后所遇到的问题的一个可运行的例子 - 我只能在任何额外的代码可能导致问题的猜测):
import java.awt.event.*;
import javax.swing.*;
public class QuickTest {
public QuickTest(){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(400, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
Timer t = new Timer(3000, null);
t.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("test");
frame.dispose();
}
});
t.setRepeats(false);
t.start();
}
});
}
public static void main(String[] args){
new QuickTest();
}
}
似乎为我工作的罚款。
确保setDefaultCloseOperation
未设置为DO_NOTHING
因为它会,什么都不做
public class TestCloseFrame {
public static void main(String[] args) {
new TestCloseFrame();
}
public TestCloseFrame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
JButton close = new JButton("Close");
close.addActionListener(new CloseAction(frame, close));
frame.add(close);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class CloseAction implements ActionListener {
private JButton button;
private JFrame frame;
private int count = 0;
public CloseAction(JFrame frame, JButton button) {
this.button = button;
this.frame = frame;
}
@Override
public void actionPerformed(ActionEvent e) {
button.setEnabled(false);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
count++;
button.setText(Integer.toString(4 - count));
if (count > 3) {
frame.dispose();
Timer timer = (Timer) e.getSource();
timer.stop();
}
}
});
timer.setInitialDelay(0);
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
}