2016-03-20 16 views
2

Ich habe eine JTextComponent und ich möchte eine Methode aufrufen, wenn Benutzer für eine bestimmte Zeit die Bearbeitung von Text in dieser JTextComponent beendet. Ich dachte daran, jedes Mal, wenn das Modell geändert wird, einen Timer zu starten und es abzubrechen, wenn ein anderer Text bearbeitet wird, aber es gibt mir das Gefühl, dass es nicht das beste Ziel ist. Können Sie Ihre Erfahrungen mit der Implementierung eines solchen Verhaltens teilen?Rufen Sie eine Methode auf, wenn Inhalt der Textkomponente für eine Weile nicht bearbeitet wird

+0

Bitte sehen bearbeiten zu beantworten. –

Antwort

4

Ja, das ist wahrscheinlich die beste Entscheidung. Sie brechen nicht einmal den Timer ab, sondern rufen einfach restart() auf dem Timer von Ihrem DocumentListener auf.

beispielsweise ein Programm, das den JTextField Hintergrund rot wird, wenn die Bearbeitung länger als 2 Sekunden inaktiv war:

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

danke für Ihre Gedanken und Beispielprogramm – polis