处置收听者内部的帧之后3秒(Dispose a frame inside a listener af

2019-10-17 09:45发布

我要处置框架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();
             }
      }

我可以从控制台看到印刷字符串,但该帧不关闭。 我已经看到了类似的线程,并使用计时器似乎是解决办法,但它不是为我工作。

Answer 1:

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();
    }
}


Answer 2:

似乎为我工作的罚款。

确保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();
        }
    }
}


文章来源: Dispose a frame inside a listener after 3 secs