এর সাধারণ উত্তরটি হল "ইউজ এ DocumentListener
" " যাইহোক, আমি সর্বদা সেই ইন্টারফেসটিকে জটিল মনে করি find সত্য সত্য ইন্টারফেস অতিরিক্ত ইঞ্জিনিয়ারড। পাঠ্য সন্নিবেশ, অপসারণ এবং প্রতিস্থাপনের জন্য এর তিনটি পদ্ধতি রয়েছে, যখন কেবলমাত্র একটি পদ্ধতি প্রয়োজন: প্রতিস্থাপন। (একটি সন্নিবেশকে কিছু পাঠ্যের সাথে কোনও পাঠ্য প্রতিস্থাপন হিসাবে দেখা যায় এবং কোনও অপসারণ কোনও পাঠ্য না করেই কোনও পাঠ্য প্রতিস্থাপন হিসাবে দেখা যায়))
সাধারণত আপনি যা জানতে চান তা হ'ল বাক্সের পাঠ্যটি কখন পরিবর্তন হয়েছে , সুতরাং একটি সাধারণ DocumentListener
প্রয়োগের তিনটি পদ্ধতিতে একটি পদ্ধতিকে কল করা হয়।
অতএব আমি নিম্নলিখিত ইউটিলিটি পদ্ধতিটি তৈরি করেছি, যা আপনাকে এগুলির ChangeListener
চেয়ে সহজতর ব্যবহার করতে দেয় DocumentListener
। (এটি জাভা 8-এর ল্যাম্বদা সিনট্যাক্স ব্যবহার করে তবে প্রয়োজনে আপনি এটি পুরানো জাভার জন্য মানিয়ে নিতে পারেন))
/**
* Installs a listener to receive notification when the text of any
* {@code JTextComponent} is changed. Internally, it installs a
* {@link DocumentListener} on the text component's {@link Document},
* and a {@link PropertyChangeListener} on the text component to detect
* if the {@code Document} itself is replaced.
*
* @param text any text component, such as a {@link JTextField}
* or {@link JTextArea}
* @param changeListener a listener to receieve {@link ChangeEvent}s
* when the text is changed; the source object for the events
* will be the text component
* @throws NullPointerException if either parameter is null
*/
public static void addChangeListener(JTextComponent text, ChangeListener changeListener) {
Objects.requireNonNull(text);
Objects.requireNonNull(changeListener);
DocumentListener dl = new DocumentListener() {
private int lastChange = 0, lastNotifiedChange = 0;
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
lastChange++;
SwingUtilities.invokeLater(() -> {
if (lastNotifiedChange != lastChange) {
lastNotifiedChange = lastChange;
changeListener.stateChanged(new ChangeEvent(text));
}
});
}
};
text.addPropertyChangeListener("document", (PropertyChangeEvent e) -> {
Document d1 = (Document)e.getOldValue();
Document d2 = (Document)e.getNewValue();
if (d1 != null) d1.removeDocumentListener(dl);
if (d2 != null) d2.addDocumentListener(dl);
dl.changedUpdate(null);
});
Document d = text.getDocument();
if (d != null) d.addDocumentListener(dl);
}
ডকুমেন্টে সরাসরি শ্রোতা যুক্ত করার বিপরীতে, এটি (অসাধারণ) কেস পরিচালনা করে যে আপনি কোনও পাঠ্য উপাদানটিতে একটি নতুন দস্তাবেজ অবজেক্ট ইনস্টল করেছেন। অধিকন্তু, এটি জিন-মার্ক অ্যাসেটসানার উত্তরে উল্লিখিত সমস্যাটিকে ঘিরে কাজ করে , যেখানে ডকুমেন্টটি কখনও কখনও তার প্রয়োজনের চেয়ে বেশি ইভেন্টে গুলি চালায় ।
যাইহোক, এই পদ্ধতিটি আপনাকে বিরক্তিকর কোডটি প্রতিস্থাপন করতে দেয় যা দেখতে এটির মতো দেখাচ্ছে:
someTextBox.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
doSomething();
}
@Override
public void removeUpdate(DocumentEvent e) {
doSomething();
}
@Override
public void changedUpdate(DocumentEvent e) {
doSomething();
}
});
সঙ্গে:
addChangeListener(someTextBox, e -> doSomething());
কোড পাবলিক ডোমেনে প্রকাশিত। আনন্দ কর!