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.
2
A
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
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
düzenlemek cevap bakınız. –