Hallo,
leider habe ich mit der Programmierung mit Java noch sehr große Probleme und verwende daher ein fertiges Java-Applet zur Menüführung auf meiner Website. Es handelt sich dabei um ein Menü, welches Untermenüpunkte aufklappt und die darunter angeordneten Hauptmenüpunkte nach unten verschiebt. Der Autor des Applets ist leider unbekannt und daher kann ich dort auch nicht nachfragen. Vielleicht kann mir hier jemand helfen!
Mein Problem ist, dass die Hauptmenüpunkte mit einem Schatteneffekt versehen sind, welche wahrscheinlich durch Kopieren und leichtes Versetzen der Schrift erzeugt werden. Da durch den Schatten die Hauptmenütexte sehr schlecht zu lesen sind, wollte ich diesen Effekt ausschalten, finde mich aber im Code nicht zurecht wo das stehen soll und was ich entfernen kann, dass es noch funktioniert.
Es werden zwei class Dateien verwendet, die Menütexte, Größen und Farben werden in HTML erzeugt. Die Applets heißen ANode.class und ShiftingMenu.class! Wäre für jede Hilfe sehr dankbar. Der Code der beiden Files sieht so aus:
Hier noch der HTML-Code:
leider habe ich mit der Programmierung mit Java noch sehr große Probleme und verwende daher ein fertiges Java-Applet zur Menüführung auf meiner Website. Es handelt sich dabei um ein Menü, welches Untermenüpunkte aufklappt und die darunter angeordneten Hauptmenüpunkte nach unten verschiebt. Der Autor des Applets ist leider unbekannt und daher kann ich dort auch nicht nachfragen. Vielleicht kann mir hier jemand helfen!
Mein Problem ist, dass die Hauptmenüpunkte mit einem Schatteneffekt versehen sind, welche wahrscheinlich durch Kopieren und leichtes Versetzen der Schrift erzeugt werden. Da durch den Schatten die Hauptmenütexte sehr schlecht zu lesen sind, wollte ich diesen Effekt ausschalten, finde mich aber im Code nicht zurecht wo das stehen soll und was ich entfernen kann, dass es noch funktioniert.
Es werden zwei class Dateien verwendet, die Menütexte, Größen und Farben werden in HTML erzeugt. Die Applets heißen ANode.class und ShiftingMenu.class! Wäre für jede Hilfe sehr dankbar. Der Code der beiden Files sieht so aus:
Code:
//
// Source File Name: ANode.java
//
import java.util.Vector;
class ANode
{
public String parseString(String s, String s1)
{
if(s == null)
return null;
if(s1 == null)
{
int i = s.indexOf(";");
if(i == -1)
{
return s;
} else
{
String s2 = s.substring(0, i);
return s2;
}
}
int j = s.indexOf(s1);
if(j == -1)
return null;
String s3 = s.substring(j + s1.length());
int k = s3.indexOf(";");
if(k != -1)
return s3.substring(0, k);
else
return s3;
}
public ANode childAt(int i)
{
return (ANode)childVector.elementAt(i);
}
public int childCount()
{
if(childVector != null)
return childVector.size();
else
return 0;
}
ANode(String s)
{
text = parseString(s, null);
url = parseString(s, "URL=");
}
public void addNode(String s)
{
if(childVector == null)
childVector = new Vector(5, 1);
ANode anode = new ANode(s);
childVector.addElement(anode);
}
public String getText()
{
if(text != null)
return text;
else
return "";
}
String text;
String url;
Vector childVector;
}
Code:
//
// Source File Name: ShiftingMenu.java
//
import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.*;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.Vector;
public class ShiftingMenu extends Applet
implements Runnable
{
public void stop()
{
if(m_ShiftingMenu != null)
{
m_ShiftingMenu.stop();
m_ShiftingMenu = null;
}
}
public void paint(Graphics g)
{
if(m_DoubleBuffer == null)
return;
Graphics g1 = m_DoubleBuffer.getGraphics();
g1.setColor(bgColor);
g1.fillRect(0, 0, APPLET_WIDTH, APPLET_HEIGHT);
if(m_fAllLoaded)
{
redrawPanel(g1);
} else
{
g1.setColor(Color.white);
g1.drawString(m_Message, 10, 20);
}
g.drawImage(m_DoubleBuffer, 0, 0, null);
}
private int getInt(String s, int i)
{
if(s == null)
return i;
int j = i;
try
{
j = Integer.parseInt(s, 10);
}
catch(Exception _ex) { }
return j;
}
private void drawTab(int i, Graphics g, int j)
{
g.drawImage(m_Menu[i], 0, j + Y_EDGE, null);
m_TabRect[i].reshape(0, j, TAB_WIDTH, TAB_HEIGHT + Y_SPACING);
}
private void drawOpenTab(int i, Graphics g, int j)
{
boolean flag = false;
g.drawImage(m_Menu[i], 0, j + Y_EDGE, null);
m_TabRect[i].reshape(0, j, TAB_WIDTH, TAB_HEIGHT + Y_SPACING);
j = j + TAB_HEIGHT + Y_SPACING;
for(int k = 0; k < numItems(i); k++)
{
int l = 0;
if(m_Hilite == k)
l = 1;
else
l = 0;
if(m_Items[i][k][l] != null)
{
g.drawImage(m_Items[i][k][l], 0, j + Y_EDGE, null);
m_ItemRect[k].reshape(0, j, TEXT_WIDTH, TEXT_HEIGHT + Y_SPACING);
j = j + TEXT_HEIGHT + Y_SPACING;
}
}
}
private Color getColor(String s, Color color)
{
Color color1;
if(s == null)
color1 = color;
else
try
{
color1 = new Color(Integer.parseInt(s, 16));
}
catch(NumberFormatException _ex)
{
color1 = color;
}
return color1;
}
public void destroy()
{
}
public int loadMenu(String s, int i, int j)
{
int k = s.indexOf("{", i);
ANode anode = new ANode(s.substring(i, k));
nodes.addElement(anode);
i = k + 1;
boolean flag = true;
try
{
do
{
StringBuffer stringbuffer = new StringBuffer(30);
boolean flag1;
do
{
char c = s.charAt(i);
i++;
flag1 = true;
switch(c)
{
case 124: // '|'
if(stringbuffer.length() > 0)
{
anode.addNode(stringbuffer.toString());
flag1 = false;
}
break;
case 125: // '}'
return i;
default:
stringbuffer.append(c);
break;
}
} while(flag1 && i < s.length());
} while(i < s.length());
}
catch(Exception _ex) { }
return -1;
}
public void LoadImages()
{
MediaTracker mediatracker = new MediaTracker(this);
Image image = null;
Image image1 = null;
Image image2 = null;
int i = 0;
boolean flag = false;
int k1 = 0;
m_Graphics = getGraphics();
m_Menu = new Image[nodes.size()];
m_TabRect = new Rectangle[nodes.size()];
m_ItemRect = new Rectangle[10];
m_Items = new Image[nodes.size()][maxItems][2];
m_MaxHeights = new int[nodes.size()];
m_Heights = new int[nodes.size()];
for(i = 0; i < nodes.size(); i++)
m_TabRect[i] = new Rectangle(0, 0, 0, 0);
i = 0;
do
m_ItemRect[i] = new Rectangle(0, 0, 0, 0);
while(++i < 10);
Image image3 = getImage(getDocumentBase(), getParameter("tabimage"));
image1 = createTextImage(false);
image2 = createTextImage(true);
mediatracker.addImage(image3, 1);
try
{
mediatracker.waitForAll();
if(mediatracker.isErrorAny())
{
stop();
return;
}
}
catch(InterruptedException _ex)
{
stop();
return;
}
image3 = gifix(image3, getParameter("tabimage"));
image = createTabImage(image3);
k1 = 0;
for(int j = 0; j < nodes.size(); j++)
{
m_Menu[j] = createImage(TAB_WIDTH, TAB_HEIGHT);
m_Menu[j].getGraphics().drawImage(image, 0, -k1, null);
k1 += TAB_HEIGHT;
}
k1 = 0;
for(int k = 0; k < nodes.size(); k++)
{
for(int i1 = 0; i1 < numItems(k); i1++)
{
m_Items[k][i1][0] = createImage(TEXT_WIDTH, TEXT_HEIGHT);
m_Items[k][i1][1] = createImage(TEXT_WIDTH, TEXT_HEIGHT);
m_Items[k][i1][0].getGraphics().drawImage(image1, 0, -k1, null);
m_Items[k][i1][1].getGraphics().drawImage(image2, 0, -k1, null);
k1 += TEXT_HEIGHT;
}
}
for(int l = 0; l < nodes.size(); l++)
{
int j1 = numItems(l);
m_MaxHeights[l] = j1 * (TEXT_HEIGHT + Y_SPACING);
}
}
public String menuName(int i)
{
int j = 0;
for(int k = 0; k < nodes.size(); k++)
{
ANode anode = (ANode)nodes.elementAt(k);
for(int l = 0; l < anode.childCount(); l++)
{
if(j == i)
return anode.childAt(l).url;
j++;
}
}
return null;
}
public Image createTextImage(boolean flag)
{
int i = 0;
for(int j = 0; j < nodes.size(); j++)
i += ((ANode)nodes.elementAt(j)).childCount();
Image image = createImage(size().width, TEXT_HEIGHT * i);
Graphics g = image.getGraphics();
Color color = getColor(getParameter("itemFGColor"), Color.white);
Color color1 = getColor(getParameter("itemHLColor"), Color.yellow);
Color color2 = getColor(getParameter("itemBGHLColor"), Color.black);
if(flag)
g.setColor(color2);
else
g.setColor(bgColor);
g.fillRect(0, 0, image.getWidth(this), image.getHeight(this));
g.setFont(itemFont);
if(flag)
g.setColor(color1);
else
g.setColor(color);
int k = TEXT_HEIGHT - g.getFontMetrics().getMaxDescent();
for(int l = 0; l < nodes.size(); l++)
{
for(int i1 = 0; i1 < ((ANode)nodes.elementAt(l)).childCount(); i1++)
{
ANode anode = ((ANode)nodes.elementAt(l)).childAt(i1);
g.drawString(anode.getText(), size().width - g.getFontMetrics().stringWidth(anode.getText()) >> 1, k);
k += TEXT_HEIGHT;
}
}
return image;
}
public void loadData(String s)
{
int i = 0;
int j = 0;
for(; i < s.length(); i = loadMenu(s, i, j));
}
private Font getFont(String s, String s1, String s2, String s3, int i, int j)
{
String s4 = new String();
if(s == null)
s4 = s3;
else
if(s.equalsIgnoreCase("TimesRoman"))
s4 = "TimesRoman";
else
if(s.equalsIgnoreCase("Courier"))
s4 = "Courier";
else
if(s.equalsIgnoreCase("Helvetica"))
s4 = "Helvetica";
else
if(s.equalsIgnoreCase("Dialog"))
s4 = "Dialog";
else
s4 = s3;
int k;
if(s1 == null)
k = 0;
else
if(s1.equalsIgnoreCase("PLAIN"))
k = 0;
else
if(s1.equalsIgnoreCase("BOLD"))
k = 1;
else
if(s1.equalsIgnoreCase("ITALIC"))
k = 2;
else
k = i;
int l;
try
{
Integer integer = new Integer(s2);
l = integer.intValue();
}
catch(Exception _ex)
{
l = j;
}
return new Font(s4, k, l);
}
public int numItems(int i)
{
return ((ANode)nodes.elementAt(i)).childCount();
}
public void start()
{
if(m_ShiftingMenu == null)
{
m_ShiftingMenu = new Thread(this);
m_ShiftingMenu.start();
}
}
public boolean mouseDown(Event event, int i, int j)
{
try
{
int k = 0;
if(m_Pos >= 0)
{
for(; k < nodes.size(); k++)
if(m_TabRect[k].inside(i, j))
{
ANode anode = (ANode)nodes.elementAt(k);
getAppletContext().showDocument(new URL(getDocumentBase(), anode.url), frame);
return true;
}
ANode anode1 = (ANode)nodes.elementAt(m_Pos);
if(m_Hilite >= 0)
{
ANode anode2 = anode1.childAt(m_Hilite);
if(anode2.url != null)
getAppletContext().showDocument(new URL(getDocumentBase(), anode2.url), frame);
} else
if(anode1.url != null)
getAppletContext().showDocument(new URL(getDocumentBase(), anode1.url), frame);
}
}
catch(MalformedURLException _ex)
{
stop();
}
return true;
}
public Image createTabImage(Image image)
{
TAB_HEIGHT = image.getHeight(this);
Image image1 = createImage(size().width, TAB_HEIGHT * nodes.size());
Graphics g = image1.getGraphics();
g.setColor(bgColor);
g.fillRect(0, 0, image1.getWidth(this), image1.getHeight(this));
Color color = getColor(getParameter("tabcolor"), Color.black);
g.setFont(topicFont);
int i = TAB_HEIGHT - g.getFontMetrics().getMaxDescent() - 1;
int j = getInt(getParameter("tabTextOffset"), 0);
for(int k = 0; k < nodes.size(); k++)
{
ANode anode = (ANode)nodes.elementAt(k);
g.drawImage(image, 0, k * TAB_HEIGHT, this);
g.setColor(Color.black);
g.drawString(anode.getText(), j + 1, i + 1);
g.setColor(color);
g.drawString(anode.getText(), j, i);
i += TAB_HEIGHT;
}
return image1;
}
public void run()
{
if(!m_fAllLoaded)
{
m_DoubleBuffer = createImage(APPLET_WIDTH, APPLET_HEIGHT);
m_Message = "Loading control panel...";
repaint();
LoadImages();
m_fAllLoaded = true;
repaint();
}
do
try
{
Thread.sleep(500L);
}
catch(InterruptedException _ex)
{
stop();
}
while(true);
}
public void init()
{
TAB_WIDTH = size().width;
TEXT_WIDTH = size().width;
bgColor = getColor(getParameter("itemBGColor"), Color.black);
nodes = new Vector(5, 5);
loadData(getParameter("menus"));
maxItems = 0;
for(int i = 0; i < nodes.size(); i++)
maxItems = Math.max(((ANode)nodes.elementAt(i)).childCount(), maxItems);
topicFont = getFont(getParameter("topicFont"), getParameter("topicStyle"), getParameter("topicSize"), "Helvetica", 1, 12);
itemFont = getFont(getParameter("itemFont"), getParameter("itemStyle"), getParameter("itemSize"), "Helvetica", 0, 10);
getGraphics().setFont(itemFont);
TEXT_HEIGHT = getGraphics().getFontMetrics().getHeight();
APPLET_WIDTH = size().width;
APPLET_HEIGHT = size().height;
frame = "_self";
if(getParameter("frame") != null)
frame = getParameter("frame");
}
private void redrawPanel(Graphics g)
{
if(m_fAllLoaded)
{
int i = 0;
boolean flag = false;
for(int j = 0; j < nodes.size(); j++)
{
int k = i;
Graphics g1 = g.create();
((Graphics)g1).clipRect(0, k, APPLET_WIDTH, m_Heights[j] + TAB_HEIGHT + Y_SPACING);
if(m_Heights[j] > 0)
drawOpenTab(j, (Graphics)g1, i);
else
drawTab(j, (Graphics)g1, i);
i = i + m_Heights[j] + TAB_HEIGHT + Y_SPACING;
}
}
}
public Image gifix(Image image, String s)
{
s = s.toLowerCase();
if(s.lastIndexOf("gif") == -1)
return image;
int i = image.getWidth(this);
int j = image.getHeight(this);
int ai[] = new int[i * (j + 1)];
PixelGrabber pixelgrabber = new PixelGrabber(image, 0, -1, i, j + 1, ai, 0, i);
try
{
pixelgrabber.grabPixels();
}
catch(InterruptedException _ex) { }
ai[0] = 0;
image = createImage(new MemoryImageSource(i, j + 1, ai, 0, i));
MediaTracker mediatracker = new MediaTracker(this);
mediatracker.addImage(image, 0);
try
{
mediatracker.waitForID(0);
}
catch(InterruptedException _ex) { }
if(mediatracker.isErrorID(0))
return null;
else
return image;
}
public ShiftingMenu()
{
m_Pos = -1;
m_Hilite = -1;
Y_SPACING = 2;
Y_EDGE = 1;
TIMING = 20;
}
public boolean mouseMove(Event event, int i, int j)
{
if(m_fAllLoaded)
{
boolean flag = false;
int j1 = 0;
if(event.when > m_LastMessage + 375L)
{
j1 = -1;
for(int k = 0; k < nodes.size(); k++)
if(m_TabRect[k].inside(i, j))
j1 = k;
if(j1 != -1 && j1 != m_Pos)
{
m_Pos = j1;
m_Hilite = -1;
int l = 0;
do
m_ItemRect[l].reshape(0, 0, 0, 0);
while(++l < 10);
l = 0;
do
{
long l1 = (new Date()).getTime();
boolean flag1 = false;
for(int k1 = 0; k1 < nodes.size(); k1++)
if(m_Heights[k1] > 0 && m_Pos != k1)
m_Heights[k1] = (m_MaxHeights[k1] * (9 - l)) / 10;
m_Heights[m_Pos] = (m_MaxHeights[m_Pos] * (l + 1)) / 10;
paint(m_Graphics);
try
{
Thread.sleep(Math.max(0L, (l1 + (long)TIMING) - (new Date()).getTime()));
}
catch(InterruptedException _ex)
{
stop();
}
} while(++l < 10);
m_LastMessage = (new Date()).getTime();
return true;
}
}
j1 = -1;
if(m_Pos > -1)
{
for(int i1 = 0; i1 < numItems(m_Pos); i1++)
if(m_Items[m_Pos][i1][0] != null && m_ItemRect[i1].inside(i, j))
j1 = i1;
if(j1 > -1 && j1 != m_Hilite)
{
if(m_Hilite != -1)
{
m_Graphics.setColor(bgColor);
m_Graphics.fillRect(m_ItemRect[m_Hilite].x, m_ItemRect[m_Hilite].y, m_ItemRect[m_Hilite].width, m_ItemRect[m_Hilite].height);
m_Graphics.drawImage(m_Items[m_Pos][m_Hilite][0], m_ItemRect[m_Hilite].x, m_ItemRect[m_Hilite].y + Y_EDGE, null);
}
m_Graphics.drawImage(m_Items[m_Pos][j1][1], m_ItemRect[j1].x, m_ItemRect[j1].y + Y_EDGE, null);
m_Hilite = j1;
}
}
if(m_Pos >= 0)
{
ANode anode = (ANode)nodes.elementAt(m_Pos);
if(m_Hilite >= 0)
anode = anode.childAt(m_Hilite);
if(anode.url != null)
showStatus(anode.url);
else
showStatus("");
}
}
return true;
}
private Thread m_ShiftingMenu;
private Graphics m_Graphics;
private boolean m_fAllLoaded;
private long m_LastMessage;
private String m_Message;
private Image m_DoubleBuffer;
private Image m_Menu[];
private Image m_Items[][][];
private Rectangle m_TabRect[];
private Rectangle m_ItemRect[];
private int m_MaxHeights[];
private int m_Heights[];
private int APPLET_WIDTH;
private int APPLET_HEIGHT;
private int m_Pos;
private int m_Hilite;
private int Y_SPACING;
private int Y_EDGE;
private int TAB_WIDTH;
private int TAB_HEIGHT;
private int TEXT_WIDTH;
private int TEXT_HEIGHT;
private int TIMING;
private boolean registered;
private Vector nodes;
private Font topicFont;
private Font itemFont;
private int maxItems;
private String frame;
private Color bgColor;
}
Hier noch der HTML-Code:
Code:
<html>
<head>
<title>Java Applet - Shifting Menue</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#0000FF" alink="#0000FF"
topmargin="10" leftmargin="10">
<p align="left">
<applet CODE="ShiftingMenu.class" WIDTH="158" HEIGHT="290" ALIGN="top">
<param name="tabimage" value="ts_hg.jpg">
<param name="tabTextOffset" value="12">
<param name="frame" value="_blank">
<param name="tabColor" value="6B4B2A">
<param name="itemBGColor" value="B5B0F3">
<param name="itemFGColor" value="6B4B2A">
<param name="itemHLColor" value="ffffff">
<param name="itemBGHLColor" value="B5B0F3">
<param name="topicFont" value="verdana">
<param name="topicStyle" value="bold">
<param name="topicSize" value="16">
<param name="itemFont" value="verdana">
<param name="itemStyle" value="plain">
<param name="itemSize" value="12">
<param name="menus"
value="
Home{
}
Organisation{
Organigram;URL=...;_blank|
Mitarbeiter;URL=...;_blank|
}
Teams{
Administration;URL=...;_blank|
Betreuung Schaltanlagen;URL=...;_blank|
Haustechnik;URL=...;_blank|
Leitungen;URL=...;_blank|
Schaltanlagen;URL=...;_blank|
Schaltgeräte;...;_blank|
Trafostationen und Kabel;URL=...;_blank|
}
Ruferreichbarkeit{
}
News{
}
Mail{
}">
</applet>
</p>
</body>
</html>