Light Box Effect (2 Windows, 1 Smaller And Active Above InactiveGrayed-Out Window)

M

markspace

Does anybody have a project that will give me a Light Box effect to a
project.

A Light Box Effect produces two windows. One window will be active,
but the one below it will be inactive and grayed out.

Here's an image of what I want to achieve.

http://stackoverflow.com/questions/6605964/lightbox-effect-in-swing


There's a class JLayer which provides the basics. You'll have to
provide a fair amount of code though; I'm not aware of any class that
provides a lightbox feature.

There's also a book call Swing Hacks which has some interesting ideas,
including an animated window similar to what you are asking for. Still
not exactly a lightbox however.

<http://docs.oracle.com/javase/tutorial/uiswing/misc/jlayer.html>
 
C

clusardi2k

Is there another way besides using JLayer. Is JLayer the best way.

Thank you,
 
M

markspace

Is there another way besides using JLayer. Is JLayer the best way.


I think it might be the only way, short of doing it yourself like that
Swing Hacks books shows you. "Best" is a hard thing to determine
without careful analysis. But JLayer is certainly the way I would
start, even if I decided later I had to change. Can't go too badly
wrong re-using code someone else already wrote.
 
C

clusardi2k


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
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,050
Latest member
AngelS122

Latest Threads

Top