首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DocumentListener与Thread.sleep

DocumentListener与Thread.sleep
EN

Stack Overflow用户
提问于 2013-05-03 15:40:30
回答 2查看 797关注 0票数 3

我想知道我什么时候写,什么时候删除,但是,在0.5秒的延迟之后,它会告诉我“您停止了写/删除”,但是它只显示了该消息,并且它删除或写了半秒的延迟。

如何正确使用Thread.sleep(500);

我目前的源代码:

代码语言:javascript
复制
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;


public class TextChangedFrame extends JFrame {

    JTextField textField = new JTextField("Put your text here");
    JLabel label = new JLabel("You have written: ");

    public TextChangedFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 100);
        setLayout(new BorderLayout());
        getContentPane().add(textField, BorderLayout.CENTER);
        getContentPane().add(label, BorderLayout.SOUTH);
        textField.getDocument().addDocumentListener(new DocumentListener() {

            public void insertUpdate(DocumentEvent e) {
                label.setText("I'm writting: " + textField.getText());
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ex) {

                }
                label.setText("I stopped writing");
            }

            public void removeUpdate(DocumentEvent e) {
                label.setText("I'm deleting");
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ex) {

                }
                label.setText("I stopped deleting");
            }

            public void changedUpdate(DocumentEvent e) {
            }
        });
    }

    public static void main(String[] args) {
        TextChangedFrame frame = new TextChangedFrame();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-03 16:02:38

同样,使用摆动计时器来做肮脏的工作。您所做的是,每当您编辑或删除,调用重新启动计时器,以重新设置定时器,并启动它。如果重新启动()方法正在运行,它将停止计时器。

代码语言:javascript
复制
     public void insertUpdate(DocumentEvent e) {
        label.setText(EDITING);
        writeDeleteTimer.restart();
     }

例如:

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

@SuppressWarnings("serial")
public class TextChangedFrame extends JPanel {

   public static final String STOPPED_EDITING = "No Longer Editing or Deleting";
   private static final String EDITING = "Editing";
   private static final String DELETING = "Deleting";
   private static final int TIMER_DELAY = 500;
   private static final int PREF_W = 400;
   private static final int PREF_H = 100;
   private JTextField textField = new JTextField("Put your text here");
   private JLabel label = new JLabel("You have written: ");
   private ActionListener timerListener = new TimerListener();
   private Timer writeDeleteTimer = new Timer(TIMER_DELAY, timerListener);

   public TextChangedFrame() {
      setLayout(new BorderLayout());
      add(textField, BorderLayout.CENTER);
      add(label, BorderLayout.SOUTH);
      textField.getDocument().addDocumentListener(new DocumentListener() {

         public void insertUpdate(DocumentEvent e) {
            label.setText(EDITING);
            writeDeleteTimer.restart();
         }

         public void removeUpdate(DocumentEvent e) {
            label.setText(DELETING);
            writeDeleteTimer.restart();
         }

         public void changedUpdate(DocumentEvent e) {
         }
      });
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent evt) {
         label.setText(STOPPED_EDITING);
         Timer timer = (Timer) evt.getSource();
         timer.stop();
      }
   }

   private static void createAndShowGui() {
      TextChangedFrame mainPanel = new TextChangedFrame();

      JFrame frame = new JFrame("TextChangedFrame");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

答案编辑:不需要重新创建计时器对象。只需调用restart(),因为如果它正在运行,它将停止当前计时器。

票数 3
EN

Stack Overflow用户

发布于 2013-05-03 15:55:51

这个问题很差,也不太清楚,所以在问题澄清之前,我是不能给出确切答案的。

目前看来,您正在使用Thread.sleep(500)造成500毫秒的延迟。在大多数程序中,这是可行的。

Thread.sleep(int x)挂起(或冻结,取决于您询问的对象)当前操作的x毫秒(在您的情况下,500毫秒)。

在您使用的应用程序中,您使用它来挂起对文本的更改。由于它的位置,它目前冻结了整个秋千箱,并没有恢复。

如果您必须使用Thread.sleep(int x),那么我建议您将正在使用的文本保存为字符串,然后在更新字符串之后更新TextChangedFrame。这允许您挂起操作,而无需挂起TextChangedFrame

PsuedoCode:

代码语言:javascript
复制
String oldString = "old string";
String newString = "new string";

// setup your dialog/popup here, with oldString

Thread.sleep(500);

// modify the dialog/popup here, changing oldString to newString

这应该能避免任何冻结问题。(我认为,带着问题和评论,你的问题是)。

一个更好的解决方案是使用 摆动计时器,正如 满是鳗鱼的气垫船 他的评论中提到的那样

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16362716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档