2016-03-20 9 views
2

私はJTextComponentを持っており、ユーザーがそのJTextComponentのテキストの編集を一定期間停止するとメソッドを呼び出す必要があります。私は、モデルが変更されるたびにタイマーを開始し、別のテキスト編集が到着したらキャンセルすることを考えていましたが、それは私に最高の欲望ではないと感じています。あなたはそのような振る舞いをどのように実装するのか経験を共有できますか?テキストコンポーネントのコンテンツがしばらく編集されていないときにメソッドを呼び出す

+0

答えるように編集を参照してください。 –

答えて

4

はい、これはおそらく最良の決定です。タイマーをキャンセルするのではなく、むしろrestart()をDocumentListenerからタイマーに呼び出すだけです。

例えば、編集が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(); 
     }); 
    } 
} 
+0

あなたの考えとサンプルプログラムに感謝します – polis

関連する問題