All Downloads are FREE. Search and download functionalities are using the official Maven repository.

bibliothek.demonstration.StartupPanel Maven / Gradle / Ivy

The newest version!
package bibliothek.demonstration;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 * A panel that is shown above the whole main-frame, this panel
 * contains nothing more than an animation. It is used to lock the
 * graphical user interface while a {@link Demonstration} is starting up.
 * @author Benjamin Sigg
 */
public class StartupPanel extends JPanel{
    /** clock ensuring repaint */
	private Timer timer;
	
	/** information about the {@link Demonstration} that is starting up */
	private JLabel text;
	
	/**
	 * Creates a new panel
	 */
	public StartupPanel(){
		timer = new Timer( 90, new ActionListener(){
			public void actionPerformed( ActionEvent e ){
				repaint();
			}
		});
		
		setVisible( false );
		setOpaque( false );
		
		text = new JLabel(){
			@Override
			public void updateUI(){
				setFont( null );
				super.updateUI();
				setFont( getFont().deriveFont( 32f ) );
			}
		};
		
		text.setOpaque( false );
		
		setLayout( new GridBagLayout() );
		JPanel panel = new JPanel( new GridBagLayout() );
		panel.setOpaque( false );
		
		panel.add( text, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0, 
				GridBagConstraints.CENTER, GridBagConstraints.NONE,
				new Insets( 10, 10, 10, 10 ), 0, 0 ) );
		panel.add( new Animation(), new GridBagConstraints( 0, 1, 1, 1, 1.0, 1.0, 
				GridBagConstraints.CENTER, GridBagConstraints.NONE,
				new Insets( 10, 10, 10, 10 ), 0, 0 ) );
		
		add( panel, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0, 
				GridBagConstraints.CENTER, GridBagConstraints.NONE,
				new Insets( 0, 0, 0, 0 ), 0, 0 ));
		
		
		addMouseMotionListener( new MouseMotionListener(){
			public void mouseDragged( MouseEvent e ){
				e.consume();
			}

			public void mouseMoved( MouseEvent e ){
				e.consume();	
			}
		});
		
		addMouseListener( new MouseListener(){
			public void mouseClicked( MouseEvent e ){
				e.consume();
			}

			public void mouseEntered( MouseEvent e ){
				e.consume();
			}

			public void mouseExited( MouseEvent e ){
				e.consume();
			}

			public void mousePressed( MouseEvent e ){
				e.consume();
			}

			public void mouseReleased( MouseEvent e ){
				e.consume();				
			}
		});
	}
	
	@Override
	protected void paintComponent( Graphics g ){
		Graphics2D g2 = (Graphics2D)g.create();
		g2.setColor( Color.WHITE );
		g2.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC_ATOP, 0.5f ) );
		g2.fillRect( 0, 0, getWidth(), getHeight() );
		g2.dispose();
	}
	
	/**
	 * Starts the animation and shows text.
	 * @param text detailed information about the current operation
	 */
	public void showAnimation( String text ){
		this.text.setText( text );
		setVisible( true );
		if( !timer.isRunning() )
			timer.start();
	}
	
	/**
	 * Stops the animation.
	 */
	public void hideAnimation(){
		setVisible( false );
		timer.stop();
	}
	
	/**
	 * A panel painting a rotating circle of circles.
	 * @author Benjamin Sigg
	 */
	private class Animation extends JPanel{
	    /**
	     * Creates a new panel
	     */
		public Animation(){
			setOpaque( false );
			
			setPreferredSize( new Dimension( 85, 85 ) );
		}
		
		@Override
		protected void paintComponent( Graphics g ){
			final int POINTS = 7;
			final float SIZE = 6; 
			final float BORDER = 3;
			
			Graphics2D g2 = (Graphics2D)g.create();
			
			g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
			
			long time = System.currentTimeMillis();
			time %= 2000;
			
			double angle = time / 2000.0 * (POINTS+1);
			angle = (int)angle;
			angle = angle / (POINTS+1) * Math.PI * 2.0;
			
			double w = getWidth();
			double h = getHeight();
			
			for( int i = 0; i < POINTS; i++ ){
				double x = Math.sin( angle );
				double y = -Math.cos( angle );
				
				angle += Math.PI * 2.0 / (POINTS+1);
				
				float strength = 1f - (POINTS - i - 1) / ((float)POINTS);
				g2.setComposite( AlphaComposite.getInstance( AlphaComposite.SRC_ATOP, strength ) );
				
				double mx = w/2 + x*w *(SIZE-2)/SIZE/2.0;
				double my = h/2 + y*h *(SIZE-2)/SIZE/2.0;
				
				g2.setColor( Color.BLACK );
				g2.fillOval( (int)(mx - w/SIZE/2), (int)(my - h/SIZE/2), (int)(w/SIZE), (int)(h/SIZE) );
				
				g2.setColor( Color.WHITE );
				g2.fillOval( (int)(mx - w/SIZE/2 + BORDER ), (int)(my - h/SIZE/2 + BORDER), (int)(w/SIZE - 2*BORDER), (int)(h/SIZE - 2*BORDER) );
			}
			
			g2.dispose();
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy