Earthquake Dialog #38
Chapter 5, Windows, Dialogs, and Frames
|
201
HACK
So, that’s what happens in the actionPerformed( ) callback. The method
takes the elapsed time and figures out how far into a cycle it is (given a cycle
time of
SHAKE_CYCLE
), expressed as a
double
between
0
and
1
. Multiply this
by
2π
, and you’ve got an angle you can pass to
Math.sin( )
. Multiply that by
SHAKE_DISTANCE
, and you’ll have an x-offset in the range -
SHAKE_DISTANCE
n
SHAKE_DISTANCE
. Add that to the
naturalLocation
’s x-value, keep the natural
y-value, and you have the new location for the dialog. Call
setLocation( )
with this point and repaint( ).
actionPerformed( )
’s only other responsibility is to check to see if the anima-
tion time has expired and, if so, to call the
stopShake( ) method, which is
public and could thus be called by an outsider to end the animation prema-
turely.
stopShake( ) stops the Timer, returns the dialog to its natural loca-
tion, and
repaint( )s.
Shake, Rattle, and Roll
I’ve provided a main( ) method to demonstrate the DialogEarthquakeCenter.
To show its flexibility, I made it shake a
JOptionPane dialog, to prove you
can still use option dialogs as well as normal dialogs, although you do need
to work with option dialogs slightly differently:
public static void main (String[] args) {
JOptionPane pane =
new JOptionPane ("You've totally screwed up your login\n" +
"Go back and do it again... and do you think\n" +
"you could remember your password this time?",
JOptionPane.ERROR_MESSAGE,
JOptionPane.OK_OPTION);
JDialog d = pane.createDialog (null, "Shakin'!");
DialogEarthquakeCenter dec = new DialogEarthquakeCenter (d);
d.pack( );
d.setModal (false);
d.setVisible(true);
dec.startShake( );
// wait (forever) for a non-null click and then quit
while (pane.getValue( ) == JOptionPane.UNINITIALIZED_VALUE ) {
try { Thread.sleep(100); }
catch (InterruptedException ie) {}
}
System.exit(0);
}
The main( ) method builds a JOptionPane dialog through what can only be
called “the other way.” Most developers will call
JOptionPane.show...
Dialog( )
because it’s convenient to get the dialog on screen immediately and
provide the user’s selection as a return value, and because it’s not necessary

Get Swing Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.