2016-03-20 23 views
2

Bir JTextComponent'im var ve kullanıcı bir metin için JTextComponent içinde metni düzenlemeyi durdurduğunda bir yöntemi çağırmak istiyorum. Başka bir metin düzenlemesi geldiğinde, modelin her değiştirilişinde bir zamanlayıcıyı başlatmayı düşünüyordum, ancak bu bana en iyi açıklama olmadığını hissettiriyor. Bu tür davranışları nasıl uygulayacağınız konusunda deneyimlerinizi paylaşır mısınız?Metin bileşeninin içeriği bir süredir düzenlenmediğinde bir yöntem çağırın.

+0

düzenlemek cevap bakınız. –

cevap

4

Evet, bu muhtemelen en iyi karardır. Zamanlayıcıyı iptal etmiyorsunuz, ancak Zamanlayıcıda DocumentListener içinden restart()'u aramanız yeterlidir. örneğin

, düzenleme 2 saniyeden fazla etkin olmadığında kırmızı JTextField arka planı döner bir program:

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

Düşünceleriniz ve örnek programınız için teşekkür ederiz. – polis

İlgili konular