في Java/Swing ، هل هناك طريقة لمحاولة التحول قانونًا؟
-
02-10-2019 - |
سؤال
كنت أتساءل عما إذا كان هناك نوع من السحر الذي يمكنني استخدامه للالتفاف على مفتاح غير قانوني والسماح لـ JTextfield بـ "محاولة التحور في الإخطار" ، أو بعبارة أخرى لتعيين نصه الخاص إذا تم تشغيل مستمعه.
للحصول على معلوماتك ، أحاول برمجة وظيفة الإكمال التلقائي التي تُرجع المطابقة الأكثر ترجيحًا في نطاق 12 من التعدادات استجابةً لإدخال المستخدم في JTextfield.
هنا عينة الكود. سيكون عليك العفو عن خوارزمية الخرقاء التي تتفوق على نتائج التعداد. لقد أبرزت الرمز الذي ينتج الاستثناء مع تعليق:
jtfElement1.addCaretListener(new CaretListener() {
@Override
public void caretUpdate(CaretEvent e) {
String s = jtfElement1.getText();
int[] attributes = new int[13];
// iterate through each enum
for (BaseEnumAttributes b: BaseEnumAttributes.values()) {
// iterate through the length of the current text in jtfElement1
for (int i = 0; i < s.length(); i++) {
if (s.length() <= b.toString().length()) {
if (b.toString().charAt(i) == s.charAt(i)) {
// increase the number of "hits" noted for that enum
attributes[b.ordinal()] = attributes[b.ordinal()] + 1;
}
}
}
}
int priorC = 0;
int rightC = 0;
// iterate through the "array" of enums to find the highest score
for (int j = 0; j < attributes.length; j++) {
if (attributes[j] > priorC) {
priorC = attributes[j];
rightC = j;
}
}
if (!s.equals("")) {
// assign to b the Enum corresponding to the "array" with highest score
BaseEnumAttributes b = BaseEnumAttributes.values()[rightC];
iController.updateInputElement1String(b.toString());
// THIS TRIGGERS EXCEPTION
jtfElement1.setText(b.toString());
}
}
});
المحلول
ربما تكون أفضل حالًا باستخدام مرشح المستند أو مستند مخصص.
ما الذي يتوقع من المستمعين الآخرين معرفة ما إذا كان المستند لا يبقى كما هو أثناء إرسال الحدث؟
نصائح أخرى
استخدم swingutabilities.invokelater () وضع جميع التعديلات هناك
ربما يمكنك تأخير setText () مع مؤشر ترابط لتشغيله بعد إنهاء CaretupDate ().
لقد وجدت في نفس المشكلة ولكني وجدت حلاً سهلاً:
قفل caretupdate () بواسطة منطقية إذا (false) أثناء تعيين النص على jtextfield من فتحه بعد. . شيء من هذا القبيل:
Caret Boolean = True ؛
private void listvaluechanged (javax.swing.event.listelectionevent evt) {caret = false ؛ name.settext ((string) list.getSelectedValue ()) ؛ كاريت = صحيح ؛ }
private void nameCaretUpdate(javax.swing.event.CaretEvent evt) {
if(caret){
model = new DefaultListModel();
this.fillList(name.getText());
list.setModel(model);
}
}
قم بإنشاء مستند مخصص وتجاوز insertString ()
filenameText = new JTextField(new FilenameDocument(), "", 0);
...
/**
* document which adds .xml extension if not specified
*
*/
private class FilenameDocument extends PlainDocument {
@Override
public void insertString(int offset, String insertedText, AttributeSet set)
throws BadLocationException {
if (offset == 0) {
insertedText = insertedText.trim( );
}
super.insertString(offset, insertedText, set);
if (filenameText != null) {
final int caretPos = filenameText.getCaretPosition();
String text = filenameText.getText().trim();
if (text.indexOf('.') == -1) {
filenameText.setText(text + ".xml");
filenameText.setCaretPosition(caretPos);
}
}
}
}
لاحظ أن استدعاء SetText سيؤدي إلى مكالمة متكررة إلى إدراج () ، لذا تأكد من أن لديك حالة توقف.
أنا مندهش من أن أحداً لم يرد على هذا ، لكن لن يكون من الأفضل تنفيذ تطبيق قابل للتحرير jspinner مع spinnerlistmodel?