• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 318
  • Last Modified:

Set Text to JText component on Applet

Hi Expert,
Please help me with set a string to jText  on a applet.

on Init I can set a text to a txtSeri text box, but when I get input from user and set text again, it cause me the problem as below.
Can you help me for this? urgent!

java.lang.IllegalStateException: Attempt to mutate in notification
      at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
      at javax.swing.text.AbstractDocument.remove(Unknown Source)
      at org.tds.maseco.invoice.OutInvoice$DocListenerHandler.insertUpdate(OutInvoice.java:427)
      at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
      at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
      at javax.swing.text.AbstractDocument.insertString(Unknown Source)
      at javax.swing.text.PlainDocument.insertString(Unknown Source)
      at org.tds.maseco.invoice.OutInvoice$LengthLimitedDocument.insertString(OutInvoice.java:449)
      at javax.swing.text.AbstractDocument.replace(Unknown Source)
      at javax.swing.text.JTextComponent.replaceSelection(Unknown Source)
      at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(Unknown Source)
      at javax.swing.SwingUtilities.notifyAction(Unknown Source)
0
CongUan
Asked:
CongUan
  • 8
  • 6
  • 2
  • +1
1 Solution
 
girionisCommented:
Hi CongUan

Are you updating the model when you change the value of the input? Can you post the code you do the update (you set the text)?

Cheers
0
 
objectsCommented:
you're trying to update the document in one of your listeners (DocListenerHandler), but as it is in the process of being editted you can't.
0
 
objectsCommented:
you should never update a document from a DocumentListener, instead try using a DocumentFilter.
0
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

 
girionisCommented:
Try to do the update from a different thread I'd say.
0
 
CongUanAuthor Commented:
Yah, I think I understand these,
But how to set text with different thread, Please give me some suggestion with my code as below:

txtSeri.setDocument(new LengthLimitedDocument());
txtSeri.getDocument().addDocumentListener(new DocListenerHandler());

I implement  LengthLimitedDocument() because I want to limit the lengt of text of input, Do you have any way to limit the lengt of input  of jText?

After  insertOutInvoice(inputText) called, I want to set text txtSeri to "" (empty).

Can you have me agian?

class DocListenerHandler implements DocumentListener {

        public void changedUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
        }

        public void insertUpdate(DocumentEvent docEvent) {
            int lengthOfText = docEvent.getDocument().getLength();
            if (OutInvoice.BARCODE_LENGTH_LIMIT == lengthOfText) {
                try {
                    String inputText = docEvent.getDocument().getText(0,
                            lengthOfText);
//                                    printBarcode(inputText);
                    insertOutInvoice(inputText);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }

        }

        public void removeUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub

        }
    }


    class LengthLimitedDocument extends PlainDocument {
        public void insertString(int offset, String str, AttributeSet attr) throws
                BadLocationException {
            if (str != null &&
                (getLength() + str.length()) <= OutInvoice.BARCODE_LENGTH_LIMIT) {
                super.insertString(offset, str, attr);
            }
        }

    }
0
 
objectsCommented:
> I implement  LengthLimitedDocument() because I want to limit the lengt of text of input, Do you have any way to limit the lengt of input  of jText?

thats fine, its your listener thats the problem

> After  insertOutInvoice(inputText) called, I want to set text txtSeri to "" (empty).

you cannot do that in a DocumentListener

th code u posted does not appear to be the same as what caused the error
0
 
girionisCommented:
0
 
girionisCommented:
Try

EventQueue.invokeLater(new Runnable()
{public void run() {
<your object>.setText("");
}
});
0
 
objectsCommented:
> EventQueue.invokeLater(new Runnable()

I'd be careful doing that in a doc listener
0
 
girionisCommented:
> > EventQueue.invokeLater(new Runnable()

> I'd be careful doing that in a doc listener

Any thoughts as to why?
0
 
girionisCommented:
> why?

I meant why not?
0
 
objectsCommented:
cause your triggering an update event from another update event.
you should instead use a DocumentFilter

http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#filter

0
 
CongUanAuthor Commented:
Hi, I try to do with

EventQueue.invokeLater(new Runnable()
{public void run() {
txtSeri.setText("");
}
});

but it cause the same problem.
Any help agian.
The below is all my code that cause the problem.

    txtSeri.setDocument(new LengthLimitedDocument());
    txtSeri.getDocument().addDocumentListener(new DocListenerHandler());


    protected void insertOutInvoice(String seriNumber) {
       /* SeriesNumber aSeriNumber = new SeriesNumber();
        aSeriNumber.setSeqNumber(outInvoiceList.size() + 1);
        aSeriNumber.setSeriCode(seriNumber);
        aSeriNumber.setProductName("KC36");
        outInvoiceList.add(aSeriNumber);
        tblObject.setOutInvoiceList(outInvoiceList);
        tblObject.refresh();
        pnTable.updateUI();
       */
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                txtSeri.setText("");
            }
        });
    }

    class DocListenerHandler implements DocumentListener {

        public void changedUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
        }

        public void insertUpdate(DocumentEvent docEvent) {
            int lengthOfText = docEvent.getDocument().getLength();
            if (OutInvoice.BARCODE_LENGTH_LIMIT == lengthOfText) {
                try {
                    String inputText = docEvent.getDocument().getText(0,
                            lengthOfText);
                    insertOutInvoice(inputText);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }

        }

        public void removeUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub

        }
    }


    class LengthLimitedDocument extends PlainDocument {
        public void insertString(int offset, String str, AttributeSet attr) throws
                BadLocationException {
            if (str != null &&
                (getLength() + str.length()) <= OutInvoice.BARCODE_LENGTH_LIMIT) {
                super.insertString(offset, str, attr);
            }
        }

    }
0
 
girionisCommented:
> cause your triggering an update event from another update event.

Yes, but won't this update go to the end of the event queue? It will only happen when the first update has finished.

> you should instead use a DocumentFilter

TBH I've never used a DocumentFilter, I guess it's a solution as well.
0
 
girionisCommented:
CongUan

you need to put the code in the document listener.
0
 
CEHJCommented:
>>insertOutInvoice(inputText);

What does 'insertOutInvoice' actually do?
0
 
objectsCommented:
using a filter your method would look something like:

public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) {
    int lengthOfText = fb.getDocument().getLength();
    if (OutInvoice.BARCODE_LENGTH_LIMIT == lengthOfText) {
    try {
        fb.remove(0, lengthOfText);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    }
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

  • 8
  • 6
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now