/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.client;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public final class WorkerCheck
{
private final JTextArea textArea;
private final Action workAction;
public static void main( String[] args ) {
new WorkerCheck();
}
private WorkerCheck() {
final Worker worker = new Worker();
textArea = new JTextArea( 10, 40 );
textArea.setEditable( false );
final Runnable workerJob = new Runnable() {
public void run() {
try {
SwingUtilities.invokeLater( new TestJob("starting the job\n", false) );
SwingUtilities.invokeLater( new TestJob("working. check that the AWT thread can repaint this window\n", false) );
// this example sleeps, but time-consuming work could be done
Thread.sleep( 7000 );
SwingUtilities.invokeLater( new TestJob("the job is done\n", true) );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
}
};
workAction = new AbstractAction("work") {
public void actionPerformed( ActionEvent event ) {
setEnabled( false );
worker.schedule( workerJob );
}
};
JPanel buttonPane = new JPanel();
buttonPane.add( new JButton(workAction) );
JFrame window = new JFrame( "WorkerTest" );
window.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE );
window.getContentPane().add( textArea, BorderLayout.CENTER );
window.getContentPane().add( buttonPane, BorderLayout.SOUTH );
window.pack();
window.addWindowListener(
new WindowAdapter()
{
// for when the window is closed by the OS
public void windowClosing( WindowEvent event )
{
worker.askToStop();
}
// for when the window is closed by Java
public void windowClosed( WindowEvent event )
{
windowClosing(event);
}
}
);
window.setVisible( true );
// the worker is being run on the main thread in this example
worker.run();
}
final class TestJob implements Runnable {
private final String message;
private final boolean enableAction;
TestJob( String message, boolean enableAction ) {
this.message = message;
this.enableAction = enableAction;
}
/** This method is invoked on the AWT thread */
public void run() {
textArea.setText( textArea.getText() + message);
if ( enableAction ) { workAction.setEnabled(true); }
}
}
}