当前位置: 首页 > 面试题库 >

停止在Java中输入JTextField后如何启动函数

司寇阳朔
2023-03-14
问题内容

停止在JTextField中键入后如何启动函数。并非每个关键版本。如果两个键的释放时间差大于1秒,则它将运行此功能。否则,请等待1秒钟。


问题答案:

使用Swing Timer和a DocumentListener每次Document更新时,重置Timer

看看如何使用Swing计时器和侦听文档中的更改以了解更多详细信息

作为一个简单的例子…

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {

            JTextField field = new JTextField(20);
            JLabel label = new JLabel("Waiting");

            DeferredDocumentListener listener = new DeferredDocumentListener(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Execute your required functionality here...
                    label.setText(label.getText() + ".");
                }
            }, true);
            field.getDocument().addDocumentListener(listener);
            field.addFocusListener(new FocusListener() {
                @Override
                public void focusGained(FocusEvent e) {
                    listener.start();
                }

                @Override
                public void focusLost(FocusEvent e) {
                    listener.stop();
                }
            });

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(field, gbc);
            add(label, gbc);
        }

    }

    public class DeferredDocumentListener implements DocumentListener {

        private final Timer timer;

        public DeferredDocumentListener(int timeOut, ActionListener listener, boolean repeats) {
            timer = new Timer(timeOut, listener);
            timer.setRepeats(repeats);
        }

        public void start() {
            timer.start();
        }

        public void stop() {
            timer.stop();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            timer.restart();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            timer.restart();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            timer.restart();
        }

    }

}


 类似资料:
  • 我试图找出如何使python停止接受输入后一定数量的时间。 到目前为止,我已经得到了工作,但不会停止程序,直到用户按下回车键。如果有关系,我在蟒蛇提示符中运行这个文件。 换句话说,我想做一些东西,这样Python就不会再等待输入了。如果用户在计时器结束前输入了任何东西,程序运行正常,这很好,除非玩家什么也没输入。如果他们甚至不按回车键,那么整个过程就会停止。(我也是Python的绝对初学者。事实上

  • 问题内容: 我正在使用我的应用程序拨打电话。 一段时间后有什么办法可以终止通话?还是在ACTION_CALL开始之前设置一个计时器? 我正在使用Prasanta博客中的以下代码,但由于某些原因,导致出现以下错误。有什么建议? 无法解决 问题答案: 您的问题已被问过很多次了。简短的答案是,没有官方的方法可以做到这一点。 在一个问题中,有人建议打开飞行模式(应用程序当然需要权限才能执行此操作)。这很粗

  • 问题内容: 我很难找到一种方法来启动,停止和重新启动Java中的线程。 具体来说,我在中有一个类Task(当前实现)。我的主应用程序需要能够在线程上启动此任务,在需要时停止(杀死)该线程,有时还可以杀死并重新启动该线程… 我的第一次尝试是与,但我似乎找不到办法重新启动任务。当我使用任何将来的呼叫失败时,因为是“关机” … 那么,我该怎么做呢? 问题答案: 一旦线程停止,你将无法重新启动它。但是,没

  • 我试图用systemctl配置Tomcat8.5.37,以在Ubuntu16.04上作为守护进程启动服务器。 为此,我在/etc/systemd/system/tomcat8.service创建了以下服务文件: Tomcat服务器是直接从apache下载的,并且只进行了解压缩。JDK是最新的Oracle JDK1.8。 当我通过startup.sh直接启动tomcat时,一切都很好。但是当我使用s

  • 我想在我停止在输入文本框中键入字符(而不是在键入字符时)后触发一个事件。 我尝试过: 但是这个例子为每个输入的字符产生一个超时,如果我输入20个字符,我会收到大约20个AJAX请求。 在这个小提琴上,我用一个简单的警报而不是AJAX来演示同样的问题。 有解决办法吗,还是我只是用了一个糟糕的方法?

  • 我无法停止。它的样式是。如何启动和停止圆形的小型?