import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.imageio.*;
import javax.swing.*;
public class MacToolbar extends JPanel implements Runnable,
MouseMotionListener, MouseListener
{
//-------------------------------------------------------------------------
// Attribute
//-------------------------------------------------------------------------
private Vector<MacBefehl> befehle = new Vector<MacBefehl>();
private int minGroesse = 40;
private int maxGroesse = 80;
private int abstand = 2;
private MacBefehl auswahl = null;
//-------------------------------------------------------------------------
// Konstruktor
//-------------------------------------------------------------------------
public MacToolbar()
{
setPreferredSize(new Dimension(500, 100));
new Thread(this).start();
addMouseListener(this);
addMouseMotionListener(this);
setOpaque(false);
setBackground(new Color(50,70,255));
setFont(new Font("Verdana",Font.BOLD,12));
}
public void neuerBefehl(String url, String text)
{
befehle.add(new MacBefehl(url, text));
}
public void paintComponent(Graphics g2)
{
super.paintComponent(g2);
Graphics2D g = (Graphics2D) g2;
int w = getSize().width;
int h = getSize().height;
g.setColor(getBackground());
g.fillRect(0,h-2*abstand-minGroesse,w,2*abstand+minGroesse);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
double gesamtbreite = -abstand;
for (MacBefehl b : befehle)
{
gesamtbreite += b.groesse + abstand;
}
int pos = (int) (w / 2 - gesamtbreite / 2);
for (MacBefehl b : befehle)
{
g.drawImage(b.bild, pos, (int) (h - abstand - b.groesse),
(int) b.groesse, (int) b.groesse, null);
pos += abstand + b.groesse;
if (b == auswahl)
{
g.setColor(getForeground());
g.drawString(b.text, (int) (pos - b.groesse / 2 - g
.getFontMetrics().stringWidth(b.text) / 2), (int) (h
- abstand -5 - b.groesse));
}
}
}
public void run()
{
while (true)
{
try
{
Thread.sleep(100);
} catch (Exception e)
{
}
for (MacBefehl b : befehle)
{
b.groesse += (b.sollgroesse - b.groesse) / 4;
}
repaint();
}
}
public void mouseMoved(MouseEvent me)
{
int x = me.getX();
double gesamtbreite = -abstand;
for (MacBefehl b : befehle)
{
gesamtbreite += b.groesse + abstand;
}
auswahl = null;
int pos = (int) (getSize().width / 2 - gesamtbreite / 2);
for (MacBefehl b : befehle)
{
b.sollgroesse = Math.max(minGroesse, maxGroesse
- Math.pow((pos + b.groesse / 2 - x) / 5, 2));
if (b.sollgroesse > maxGroesse - 10)
auswahl = b;
pos += abstand + b.groesse;
}
}
public void mouseEntered(MouseEvent me)
{
}
public void mouseExited(MouseEvent me)
{
auswahl=null;
for( MacBefehl b : befehle )
b.sollgroesse=minGroesse;
}
public void mouseClicked(MouseEvent me)
{
if( auswahl!=null )
{
System.out.println( auswahl.text+" wurde gewählt");
auswahl=null;
for( MacBefehl b : befehle )
b.sollgroesse=minGroesse;
}
}
public void mousePressed(MouseEvent me)
{
}
public void mouseReleased(MouseEvent me)
{
}
public void mouseDragged(MouseEvent me)
{
}
public static void main(String[] args)
{
JFrame f = new JFrame("Beispiel für eine Mac-Toolbar");
MacToolbar m = new MacToolbar();
m.setPreferredSize(new Dimension(800, 150));
m.neuerBefehl(
"http://lesliefranke.com/files/firefoxyourway/images/firefox.png",
"Firefox");
m.neuerBefehl(
"http://img.search.com/thumb/5/52/OpenOffice.org_2_icon.png/48px-OpenOffice.org_2_icon.png",
"OpenOffice");
m.neuerBefehl(
"http://poczta.most.org.pl/ustawienia/opera.png",
"Opera");
f.add(m, "South");
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private class MacBefehl
{
public String url;
public String text;
public Image bild;
public double groesse = minGroesse;
public double position = 0;
public double sollgroesse = minGroesse;
public MacBefehl(String url, String text)
{
this.url = url;
this.text = text;
try
{
this.bild = ImageIO.read(new URL(url));
} catch (Exception e)
{
System.out.println("Befehl '" + text
+ "' konnte nicht geladen werden");
}
}
}
}