有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

当文本组件的内容有一段时间未编辑时,java调用一个方法

我有一个JTextComponent,我想在用户停止编辑该JTextComponent中的文本一段时间后调用一个方法。我想在每次修改模型时启动一个计时器,如果另一个文本编辑到达,则取消它,但这让我感觉这不是最好的设计。你能分享你的经验如何实施这种行为吗


共 (1) 个答案

  1. # 1 楼答案

    是的,这可能是最好的决定。您甚至不取消计时器,而只是从DocumentListener中调用计时器上的restart()

    例如,如果编辑已停用超过2秒,则将JTextField背景变为红色的程序:

    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    @SuppressWarnings("serial")
    public class ResetCounter2 extends JPanel {
        private static final int TIMER_DELAY = 2000; // 2 seconds
        public static final Color LATE_BACKGROUND = Color.RED;
        private JTextField textField = new JTextField(10);
        private Timer timer = new Timer(TIMER_DELAY, new TimerListener());
    
        public ResetCounter2() {
            textField.getDocument().addDocumentListener(new MyDocListener());
            add(textField);
    
            // make sure timer does not repeat and then start it
            timer.setRepeats(false);
            timer.start();
        }
    
        private class MyDocListener implements DocumentListener {
    
            @Override
            public void changedUpdate(DocumentEvent e) {
                docChanged();
            }
    
            @Override
            public void insertUpdate(DocumentEvent e) {
                docChanged();
            }
    
            @Override
            public void removeUpdate(DocumentEvent e) {
                docChanged();
            }
    
            private void docChanged() {
                textField.setBackground(null);
                timer.restart();
            }
    
        }
    
        private class TimerListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                textField.setBackground(LATE_BACKGROUND);
            }
        }
    
        private static void createAndShowGui() {
            ResetCounter2 mainPanel = new ResetCounter2();
    
            JFrame frame = new JFrame("ResetCounter");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                createAndShowGui();
            });
        }
    }