Solved

Set Text to JText component on Applet

Posted on 2006-07-14
17
253 Views
Last Modified: 2008-02-07
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
Comment
Question by:CongUan
  • 8
  • 6
  • 2
  • +1
17 Comments
 
LVL 35

Expert Comment

by:girionis
Comment Utility
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
 
LVL 92

Expert Comment

by:objects
Comment Utility
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
 
LVL 92

Expert Comment

by:objects
Comment Utility
you should never update a document from a DocumentListener, instead try using a DocumentFilter.
0
 
LVL 35

Expert Comment

by:girionis
Comment Utility
Try to do the update from a different thread I'd say.
0
 

Author Comment

by:CongUan
Comment Utility
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
 
LVL 92

Expert Comment

by:objects
Comment Utility
> 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
 
LVL 35

Expert Comment

by:girionis
Comment Utility
0
 
LVL 35

Expert Comment

by:girionis
Comment Utility
Try

EventQueue.invokeLater(new Runnable()
{public void run() {
<your object>.setText("");
}
});
0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 92

Expert Comment

by:objects
Comment Utility
> EventQueue.invokeLater(new Runnable()

I'd be careful doing that in a doc listener
0
 
LVL 35

Expert Comment

by:girionis
Comment Utility
> > EventQueue.invokeLater(new Runnable()
>
> I'd be careful doing that in a doc listener

Any thoughts as to why?
0
 
LVL 35

Expert Comment

by:girionis
Comment Utility
> why?

I meant why not?
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
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
 

Author Comment

by:CongUan
Comment Utility
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
 
LVL 35

Expert Comment

by:girionis
Comment Utility
> 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
 
LVL 35

Accepted Solution

by:
girionis earned 500 total points
Comment Utility
CongUan

you need to put the code in the document listener.
0
 
LVL 86

Expert Comment

by:CEHJ
Comment Utility
>>insertOutInvoice(inputText);

What does 'insertOutInvoice' actually do?
0
 
LVL 92

Expert Comment

by:objects
Comment Utility
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

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

For customizing the look of your lightweight component and making it look lucid like it was made of glass. Or: how to make your component more Apple-ish ;) This tip assumes your component to be of rectangular shape and completely opaque. (COD…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

7 Experts available now in Live!

Get 1:1 Help Now