/**
* Copyright (c) 2002-2005, Simone Bordet
* All rights reserved.
*
* This software is distributable under the BSD license.
* See the terms of the BSD license in the documentation provided with this software.
*/
package foxtrot.examples;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import foxtrot.Task;
import foxtrot.Worker;
/**
* A very simple example that shows Swing limits. <br>
* A button executes a time-consuming task, and when executing this task the same button is used to
* interrupt the task. <br>
* This is impossible to do with plain Swing, but easy with Foxtrot.
*
* For a comparison, look at the freezeSleep method and to the workerSleep method, and try to run the
* example one time with one method, and one time with the other.
*
* @version $Revision: 1.6 $
*/
public class SimpleExample extends JFrame
{
private boolean sleeping;
private JButton button;
public static void main(String[] args)
{
SimpleExample example = new SimpleExample();
example.setVisible(true);
}
public SimpleExample()
{
super("Foxtrot Example");
button = new JButton("Take a nap !");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (sleeping)
wakeUp();
else
sleep();
}
});
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new GridBagLayout());
c.add(button);
setSize(300, 200);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Dimension size = getSize();
int x = (screen.width - size.width) >> 1;
int y = (screen.height - size.height) >> 1;
setLocation(x, y);
}
private void sleep()
{
button.setText("Wake me up!");
workerSleep();
// freezeSleep();
button.setText("Take a nap!");
}
private void workerSleep()
{
try
{
Worker.post(new Task()
{
public Object run() throws InterruptedException
{
synchronized (SimpleExample.this)
{
sleeping = true;
SimpleExample.this.wait();
sleeping = false;
}
return null;
}
});
}
catch (InterruptedException x)
{
x.printStackTrace();
}
catch (Exception x)
{
// Never thrown
}
}
private void freezeSleep()
{
try
{
synchronized (this)
{
sleeping = true;
wait();
sleeping = false;
}
}
catch (InterruptedException x)
{
x.printStackTrace();
}
}
private void wakeUp()
{
synchronized (this)
{
notifyAll();
}
}
}