Re: Light Box Effect (2 Windows, 1 Smaller And Active Above Inactive
Grayed-Out Window)
On Friday, August 17, 2012 8:30:58 AM UTC-4, (unknown) wrote:
The book is here: http://www.scribd.com/doc/15490884/Swing-Hacks-Tips-and-Tools-for-Killer-GUIs
Here's the HACK #45 code from the book. It has two buttons. If you press one of th buttons everything on the screen will move away and the screen will become blank.
Question: How on Earth do I convert this into a light box effect.
Here is a link to other fun JLayer examples:
http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html
//File: SheetTest.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package anisheetablejframe;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
public class SheetTest extends Object
implements PropertyChangeListener {
JOptionPane optionPane;
AniSheetableJFrame frame;
public static void main (String[] args) {
new SheetTest( );
}
public SheetTest ( ) {
frame = new AniSheetableJFrame ("Sheet test");
// put an image in the frame's content pane
ImageIcon icon = new ImageIcon ("keagy-lunch.png");
JLabel label = new JLabel (icon);
frame.getContentPane( ).add(label);
// build JOptionPane dialog and hold onto it
optionPane = new JOptionPane ("Do you want to save?",
JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION);
frame.pack( );
frame.setVisible(true);
optionPane.addPropertyChangeListener (this);
// pause for effect, then show the sheet
try {Thread.sleep(1000);}
catch (InterruptedException ie) {}
JDialog dialog =
optionPane.createDialog (frame, "irrelevant");
frame.showJDialogAsSheet (dialog);
}
public void propertyChange (PropertyChangeEvent pce) {
if (pce.getPropertyName( ).equals (JOptionPane.VALUE_PROPERTY)) {
System.out.println ("Selected option " +
pce.getNewValue( ));
frame.hideSheet( );
}
}
}
//---------------------------
//File AnimatingSheet.java
package anisheetablejframe;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
import javax.swing.JPanel;
class AnimatingSheet extends JPanel {
Dimension animatingSize = new Dimension (0, 1);
JComponent source;
BufferedImage offscreenImage;
public AnimatingSheet ( ) {
super( );
setOpaque(true);
}
public void setSource (JComponent source) {
this.source = source;
animatingSize.width = source.getWidth( );
makeOffscreenImage(source);
}
public void setAnimatingHeight (int height) {
animatingSize.height = height;
setSize (animatingSize);
}
private void makeOffscreenImage(JComponent source) {
GraphicsConfiguration gfxConfig =
GraphicsEnvironment.getLocalGraphicsEnvironment( )
.getDefaultScreenDevice( )
.getDefaultConfiguration( );
offscreenImage =
gfxConfig.createCompatibleImage(source.getWidth( ),
source.getHeight( ));
Graphics2D offscreenGraphics =
(Graphics2D) offscreenImage.getGraphics( );
source.paint (offscreenGraphics);
}
public Dimension getPreferredSize( ) { return animatingSize; }
public Dimension getMinimumSize( ) { return animatingSize; }
public Dimension getMaximumSize( ) { return animatingSize; }
public void paint (Graphics g) {
// get the bottom-most n pixels of source and
// paint them into g, where n is height
int x = 0;
int y = offscreenImage.getHeight() - animatingSize.height;
int w = source.getWidth();
int h = animatingSize.height;
BufferedImage fragment =
offscreenImage.getSubimage (x,y,w,h);
// g.drawImage (fragment, 0, 0, this);
g.drawImage (fragment, 0, 0, this);
}
}
//---------------------------
//File AniSheettableJFrame.java
package anisheetablejframe;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class AniSheetableJFrame extends JFrame
implements ActionListener {
public static final int INCOMING = 1;
public static final int OUTGOING = -1;
public static final float ANIMATION_DURATION = 1000f;
public static final int ANIMATION_SLEEP = 50;
JComponent sheet;
JPanel glass;
AnimatingSheet animatingSheet;
boolean animating;
int animationDirection;
Timer animationTimer;
long animationStart;
BufferedImage offscreenImage;
public AniSheetableJFrame (String name) {
super(name);
glass = (JPanel) getGlassPane( );
glass.setLayout (new GridBagLayout( ));
animatingSheet = new AnimatingSheet( );
animatingSheet.setBorder (new LineBorder(Color.black, 1));
}
public JComponent showJDialogAsSheet (JDialog dialog) {
sheet = (JComponent) dialog.getContentPane( );
sheet.setBorder (new LineBorder(Color.black, 1));
glass.removeAll( );
animationDirection = INCOMING;
startAnimation( );
return sheet;
}
public void hideSheet( ) {
animationDirection = OUTGOING;
startAnimation( );
}
private void startAnimation( ) {
glass.repaint( );
// clear glasspane and set up animatingSheet
animatingSheet.setSource (sheet);
glass.removeAll( );
GridBagConstraints gbc = new GridBagConstraints( );
gbc.anchor = GridBagConstraints.NORTH;
glass.add (animatingSheet, gbc);
gbc.gridy=1;
gbc.weighty = Integer.MAX_VALUE;
glass.add (Box.createGlue( ), gbc);
glass.setVisible(true);
// start animation timer
animationStart = System.currentTimeMillis( );
if (animationTimer == null)
animationTimer = new Timer (ANIMATION_SLEEP, this);
animating = true;
animationTimer.start( );
}
private void stopAnimation( ) {
animationTimer.stop( );
animating = false;
}
// used by the Timer
public void actionPerformed (ActionEvent e) {
if (animating) {
// calculate height to show
float animationPercent =
(System.currentTimeMillis( ) - animationStart) /
ANIMATION_DURATION;
animationPercent = Math.min (1.0f, animationPercent);
int animatingHeight = 0;
if (animationDirection == INCOMING) {
animatingHeight =
(int) (animationPercent * sheet.getHeight( ));
} else {
animatingHeight =
(int) ((1.0f - animationPercent) * sheet.getHeight( ));
}
// clip off that much from sheet and blit it
// into animatingSheet
animatingSheet.setAnimatingHeight (animatingHeight);
animatingSheet.repaint( );
if (animationPercent >= 1.0f) {
stopAnimation( );
if (animationDirection == INCOMING) {
finishShowingSheet( );
} else {
glass.removeAll( );
glass.setVisible(false);
}
}
}
}
private void finishShowingSheet( ) {
glass.removeAll( );
GridBagConstraints gbc = new GridBagConstraints( );
gbc.anchor = GridBagConstraints.NORTH;
glass.add (sheet, gbc);
gbc.gridy=1;
gbc.weighty = Integer.MAX_VALUE;
glass.add (Box.createGlue( ), gbc);
glass.revalidate( );
glass.repaint( );
}
// inner class AnimatedSheet goes here
}