1

実行時に Text を JTextFields の null に設定する方法を教えてください。長さが "13" に等しいときにテキストフィールドを空にしたいです。ユーザーに The text (code has size 13 max) を入力するように求め、その後、入力は別のプロセスのために null に変更されます。

code = new JextField(15); 
code.setForeground(new Color(30, 144, 255));
code.setFont(new Font("Tahoma", Font.PLAIN, 16));
code.setHorizontalAlignment(SwingConstants.CENTER);   
code.setBounds(351, 76, 251, 38);
panel_2.add(code);

code.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
  test();
}
public void removeUpdate(DocumentEvent e) {
  test();
}
public void insertUpdate(DocumentEvent e) {
   test();
}
public void test() {
if(code.getText().length()==13){                  
   code.setText("");                
 }                
}

次のエラーが表示されます:

java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
    at javax.swing.text.AbstractDocument.replace(Unknown Source)
    at javax.swing.text.JTextComponent.setText(Unknown Source)
4

2 に答える 2

4

を使用して、 の基にDocumentListenerなるものを変更することはできません。代わりにaを使用してください。DocumentJTextComponentDocumentFilter

追加:

AbstractDocument d = (AbstractDocument) code.getDocument();
d.setDocumentFilter(new MaxLengthFilter(13));

DocumentFilter:_

 static class MaxLengthFilter extends DocumentFilter {

   private final int maxLength;

   public MaxLengthFilter(int maxLength) {
      this.maxLength = maxLength;
   }

   @Override
   public void replace(DocumentFilter.FilterBypass fb, int offset,
         int length, String text, AttributeSet attrs)
               throws BadLocationException {

      int documentLength = fb.getDocument().getLength();
      if (documentLength >= maxLength) {
         super.remove(fb, 0, documentLength);
      } else {
         super.replace(fb, offset, length, text, attrs);
      }
   }
}
于 2013-07-16T00:39:51.283 に答える