0

我想在我键入一个键后 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();
             }
      }

我可以从控制台看到打印的字符串,但框架没有关闭。我看过一个类似的线程,使用 Timer 似乎是解决方案,但它对我不起作用。

4

2 回答 2

2

frame.dispose()不保证立即执行。我发现frame.setVisible(false)先调用有助于加快处理过程。

编辑

此外,您可能希望查看使用键绑定而不是键侦听器来触发您的事件。关键侦听器很复杂,通常不是很有用(它们需要专注于您正在与之交互的项目,它们往往会消耗事件,因此您看不到它们)。

编辑 2

在进一步检查您的代码后,问题似乎是您需要将计时器设置为不重复(在您调用 start 之前):

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();
    }
}
于 2012-11-20T14:38:24.790 回答
1

似乎对我来说工作得很好。

确保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();
        }
    }
}
于 2012-11-20T20:45:28.017 回答