【问题标题】:Java - delay between events after entering the value into JTextAreaJava - 将值输入 JTextArea 后事件之间的延迟
【发布时间】:2020-01-09 19:39:09
【问题描述】:

我准备了一个 JTextArea 所在的简单表单 (javax.swing.JFrame)。 输入“TAB”值后,我想在表单上看到一个可见的 JPanel 几秒钟。不幸的是,当我发生以下事件时:

 <br>
JPanel.setVisible (true); <br>
TimeUnit.SECONDS.sleep (3); <br>
JPanel.setVisible (false); <br>
in keyPressed for JTextArea.KeyListener ()

它们不会一个接一个地执行——首先我睡着了,然后是 JPanel.setVisible (true) 和 JPanel.setVisible (false)

public class Form1 extends JFrame {

    JTextArea txt1 = new JTextArea();
    JPanel pnl2 = new JPanel();

    public Form1() {

        txt1.setLocation(10, 10);
        txt1.setSize(100, 30);
        txt1.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e
            ) {
                if (e.getKeyCode() == KeyEvent.VK_TAB) {
                    e.consume();

                    pnl2.setVisible(true);
                    try {
                        TimeUnit.SECONDS.sleep(3);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Form1.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    pnl2.setVisible(false);
                }
            }

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e
            ) {
            }
        });
        add(txt1);

        pnl2.setLayout(null);
        pnl2.setLocation(10, 150);
        pnl2.setSize(100, 100);
        pnl2.setBorder(BorderFactory.createEtchedBorder());
        pnl2.setVisible(false);
        add(pnl2);
    }
}

主类:

public class Main {

    public static void main(String[] args)  {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Form1 f = new Form1()
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(500, 400);
                f.setLocationRelativeTo(null);
                f.setResizable(false);
                f.setLayout(null);
                f.setVisible(true);
            }
        }
        );
    }
}

如何在TextArea上输入“TAB”按钮后在表单上显示面板几秒钟的效果?

【问题讨论】:

    标签: java swing delay jtextarea event-dispatch-thread


    【解决方案1】:

    不要阻塞 AWT 事件调度线程 (EDT)。

    改为设置javax.swing.Timer(获取正确的包 - 而不是另一个!)。 Swing Timer 可能会创建另一个线程来进行计时,但会通过 EDT(通过 java.awt.EventQueue.invokeLater 或类似方式)将事件发回。在sleep 之后执行的代码应该移动到一个动作监听器。

                    pnl2.setVisible(true);
                    javax.swing.Timer timer =
                        new javax.swing.Timer(3000, event -> {
                            pnl2.setVisible(false);
                        });
                    timer.setRepeats(false);
                    timer.start();
    

    (我用全限定名来强调正确的Timer。有时我忘记了默认情况下它会重复,这会令人困惑。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多