{
// Overlay
final WebOverlay overlayPanel = new WebOverlay ();
// Progress displayed as overlay
final WebProgressBar overlay = new WebProgressBar ();
overlay.setPreferredProgressWidth ( 100 );
overlay.setStringPainted ( true );
// Additional centering panel that soaks mouse events to prevent textarea interactions
final CenterPanel centeredOverlay = new CenterPanel ( overlay );
centeredOverlay.setVisible ( false );
EmptyMouseAdapter.install ( centeredOverlay );
overlayPanel.addOverlay ( centeredOverlay );
// Overlayed text area
final WebTextArea component = new WebTextArea ();
component.setColumns ( 20 );
component.setRows ( 3 );
component.setLineWrap ( true );
component.setWrapStyleWord ( true );
component.addMouseListener ( new MouseAdapter ()
{
private String toAdd = "";
private int step = 5;
@Override
public void mousePressed ( MouseEvent e )
{
// Block action on disabled state
if ( !component.isEnabled () )
{
return;
}
// Updating string to write
if ( toAdd.length () == 0 )
{
toAdd = ExamplesManager.createSmallString ();
}
// Disabling textarea editing
component.setEditable ( false );
component.setSelectionStart ( component.getText ().length () );
component.setSelectionEnd ( component.getText ().length () );
component.setCaretPosition ( component.getText ().length () );
// Initializing progress
overlay.setMinimum ( 0 );
overlay.setValue ( 0 );
overlay.setMaximum ( toAdd.length () );
// Displaying overlay
centeredOverlay.setVisible ( true );
// Starting update thread
new Thread ( new Runnable ()
{
@Override
public void run ()
{
while ( toAdd.length () > 0 )
{
final int left = Math.min ( step, toAdd.length () );
SwingUtils.invokeAndWaitSafely ( new Runnable ()
{
@Override
public void run ()
{
component.append ( toAdd.substring ( 0, left ) );
overlay.setValue ( overlay.getValue () + left );
}
} );
toAdd = toAdd.substring ( left );
ThreadUtils.sleepSafely ( 50 );
}