Saya ingin kotak pesan muncul segera setelah pengguna mengubah nilai di bidang teks. Saat ini, saya perlu menekan tombol enter untuk mengeluarkan kotak pesan. Apakah ada yang salah dengan kode saya?
textField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (Integer.parseInt(textField.getText())<=0){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Message",
JOptionPane.ERROR_MESSAGE);
}
}
}
Bantuan apa pun akan dihargai!
java
swing
listener
jtextfield
documentlistener
pengguna236501
sumber
sumber
Jawaban yang biasa untuk ini adalah "gunakan a
DocumentListener
". Namun, saya selalu menemukan antarmuka yang rumit. Sejujurnya antarmuka over-engineered. Ini memiliki tiga metode, untuk penyisipan, penghapusan, dan penggantian teks, ketika hanya membutuhkan satu metode: penggantian. (Penyisipan dapat dilihat sebagai pengganti tanpa teks dengan beberapa teks, dan penghapusan dapat dilihat sebagai penggantian beberapa teks tanpa teks.)Biasanya yang Anda inginkan adalah mengetahui kapan teks dalam kotak telah berubah , jadi ini tipikal
DocumentListener
implementasi memiliki tiga metode yang memanggil satu metode.Karena itu saya membuat metode utilitas berikut, yang memungkinkan Anda menggunakan yang lebih sederhana
ChangeListener
daripadaDocumentListener
. (Menggunakan sintaks Java 8, tetapi Anda dapat mengadaptasinya untuk Java lama jika diperlukan.)Berbeda dengan menambahkan pendengar langsung ke dokumen, ini menangani kasus (tidak umum) yang Anda instal objek dokumen baru pada komponen teks. Selain itu, ia bekerja di sekitar masalah yang disebutkan dalam jawaban Jean-Marc Astesana , di mana dokumen itu terkadang menembakkan lebih banyak peristiwa daripada yang diperlukan.
Bagaimanapun, metode ini memungkinkan Anda mengganti kode yang menjengkelkan yang terlihat seperti ini:
Dengan:
Kode dirilis ke domain publik. Selamat bersenang-senang!
sumber
abstract class DocumentChangeListener implements DocumentListener
dengan metode abstrak ekstrachange(DocumentEvent e)
yang Anda panggil dari ketiga metode lainnya. Tampak lebih jelas bagi saya karena menggunakan kurang lebih logika yang sama denganabstract *Adapter
pendengar.changedUpdate
metode harus dipanggil secara eksplisit melalui panggilan dalam masing-masinginsertUpdate
danremoveUpdate
, untuk membuatnya berfungsi ..Cukup buat antarmuka yang memperluas DocumentListener dan mengimplementasikan semua metode DocumentListener:
lalu:
atau Anda bahkan dapat menggunakan ekspresi lambda:
sumber
Sadarilah bahwa ketika pengguna memodifikasi bidang, DocumentListener dapat, kadang-kadang, menerima dua peristiwa. Misalnya, jika pengguna memilih seluruh konten bidang, lalu tekan tombol, Anda akan menerima removeUpdate (semua konten dihapus) dan insertUpdate. Dalam kasus Anda, saya pikir itu bukan masalah tetapi, secara umum, itu masalah. Sayangnya, sepertinya tidak ada cara untuk melacak konten textField tanpa mensubklasifikasikan JTextField. Berikut adalah kode dari kelas yang menyediakan properti "teks":
sumber
Saya tahu ini berkaitan dengan masalah yang sangat lama, namun, itu menyebabkan saya juga mengalami masalah. Ketika kleopatra merespons dalam komentar di atas, saya memecahkan masalah dengan a
JFormattedTextField
. Namun, solusinya memerlukan sedikit lebih banyak pekerjaan, tetapi lebih rapi.Tidak
JFormattedTextField
secara default memicu perubahan properti setelah setiap teks berubah di bidang. Konstruktor defaultJFormattedTextField
tidak membuat formatter.Namun, untuk melakukan apa yang disarankan OP, Anda perlu menggunakan formatter yang akan memanggil
commitEdit()
metode setelah setiap pengeditan yang valid dari lapangan. ThecommitEdit()
Metode inilah yang memicu perubahan properti dari apa yang saya lihat dan tanpa formatter, hal ini dipicu oleh default pada perubahan fokus atau ketika tombol enter ditekan.Lihat http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value untuk rincian lebih lanjut.
Buat objek formatter (
DefaultFormatter
) default untuk diteruskan keJFormattedTextField
baik melalui konstruktornya atau metode penyetel. Salah satu metode formatter default adalahsetCommitsOnValidEdit(boolean commit)
, yang mengatur formatter untuk memicucommitEdit()
metode setiap kali teks diubah. Ini kemudian dapat diambil dengan menggunakanPropertyChangeListener
danpropertyChange()
metode.sumber
Tapi saya tidak akan hanya menguraikan apa pun yang pengguna (mungkin tidak sengaja) sentuh pada keyboardnya menjadi
Integer
. Anda harus menangkap adaException
yang terlempar dan pastikanJTextField
tidak kosong.sumber
Jika kita menggunakan metode runnable, SwingUtilities.invokeLater () saat menggunakan aplikasi pendengar dokumen terkadang macet dan meluangkan waktu untuk memperbarui hasilnya (sesuai eksperimen saya). Selain itu kami juga dapat menggunakan acara KeyReleased untuk pendengar perubahan bidang teks seperti yang disebutkan di sini .
sumber
itu adalah versi pembaruan Codemwnci. kodenya cukup baik dan berfungsi baik kecuali pesan kesalahan. Untuk menghindari kesalahan, Anda harus mengubah pernyataan kondisi.
sumber
Anda bahkan dapat menggunakan "MouseExited" untuk mengontrol. contoh:
sumber
Saya baru mengenal WindowBuilder, dan, pada kenyataannya, baru kembali ke Jawa setelah beberapa tahun, tetapi saya menerapkan "sesuatu", kemudian berpikir saya akan mencarinya dan menemukan utas ini.
Saya di tengah menguji ini, jadi, berdasarkan menjadi baru untuk semua ini, saya yakin saya pasti kehilangan sesuatu.
Inilah yang saya lakukan, di mana "runTxt" adalah kotak teks dan "runName" adalah anggota data kelas:
Tampaknya jauh lebih sederhana daripada apa yang ada di sini sejauh ini, dan tampaknya berhasil, tetapi, karena saya sedang menulis ini, saya sangat menghargai mendengar ada gotcha yang diabaikan. Apakah ini masalah dimana pengguna dapat masuk & meninggalkan kotak teks tanpa membuat perubahan? Saya pikir semua yang Anda lakukan adalah tugas yang tidak perlu.
sumber
Gunakan KeyListener (yang memicu pada sembarang tombol) daripada ActionListener (yang terpicu saat masuk)
sumber
field.getText()
mengembalikan nilai awal. dan event (arg0.getKeyChar()
) mengembalikan pemeriksaan kesalahan tombol ditekan diperlukan untuk menentukan apakah Anda harus menyatukan dengan teks bidang.DocumentFilter ? Ini memberi Anda kemampuan untuk memanipulasi.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Maaf. Saya menggunakan Jython (Python di Jawa) - tetapi mudah dimengerti
sumber