| 
         
     
     | 
     | 
    
  
    | 
    用Applet写的菜单程序 machine | 
   
  
     | 
   
  
     | 
   
  
    | 
     作者:未知  来源:月光软件站  加入时间:2005-2-28 月光软件站  | 
   
  
    : 前几天在java.sun.com上看见一个用Applet写的菜单程序。由于Applet目前不支持Menu(  据我所知),: 也许这个程序对你有些帮助。  原来的程序好像不完整,无法编译,我特地到java.sun.com上又载了一个,  source如下:  /*  Copyright: Sun Microsystems 1997. All rights reserved.  Author: Patrick Chan (www.xeo.com) 7/19/96  Version: 1.1  */ 
  import java.applet.*;  import java.awt.*;  import java.util.*;  import java.net.*; 
  public class XeoMenu extends Applet {  // The background image. This had better not be null.  Image image; 
  // These two fields are used to do double-buffering.  // The dimensions of bbuf is exactly the dimensions of the applet.  Image bbuf;  Graphics bbufG; 
  // This field is set to true only when the background image has  // completely loaded.  boolean imageDone; 
  /* Menu data */  Rectangle[] hitArea;  Rectangle[] srcRect;  Point[] dstPt;  boolean[] down;  String[] url; 
  /* Submenu data */  String[][] itemUrl;  String[][] item; 
  // If >= 0, this fields holds the index of the current menu.  // If -1, no menu is current.  int curMenu; 
  // If >= 0, this fields holds the index of the current menu item.  // If -1, no menu item is current.  int curMenuItem; 
  // This is an array of rectangles - one rectangle for each menu item.  // Each rectangle specifies the  // location (relative to the left-corner of the applet) of a menu item.  //  // menuItemRect is null when curMenu is -1.  // It becomes non-null when curMenu >= 0.  //  // Note: it would have been better programming to define classes for  // the menu and menu items. However, I decided for this little applet  // to keep the number of class files to a minimum to minimize the download  // time.  Rectangle[] menuItemRect; 
  // This is the color to paint "behind" the image.  Color bgColor; 
  // [0] is the text color of a menu item; [1] is the text color of a highlig  hted // menu item.  Color fgMenuColor[] = new Color[2]; 
  // This is the background of a menu item; [1] is the background color of a  // highlighted menu item.  Color bgMenuColor[] = new Color[2]; 
  // marginH is the number of pixels on the left and right edges of the menu.  // marginV is the number of pixels on the top and bottom edges of the menu.  int marginH, marginV; 
  // This is the font used to display the menu item labels.  Font f; 
  // This is the font metrics of 'f'.  FontMetrics fm; 
  public void init() {  int[] ints; 
 
  // Grab applet parameters.  image = getImage(getCodeBase(), getParameter("image"));  marginH = Integer.parseInt(getParameter("marginh"));  marginV = Integer.parseInt(getParameter("marginv")); 
  // Get color parameters.  ints = parseInt(getParameter("bg-color"), " ");  bgColor = new Color(ints[0], ints[1], ints[2]);  ints = parseInt(getParameter("fg-menu-color"), " ");  fgMenuColor[0] = new Color(ints[0], ints[1], ints[2]);  ints = parseInt(getParameter("fg-hi-menu-color"), " ");  fgMenuColor[1] = new Color(ints[0], ints[1], ints[2]);  ints = parseInt(getParameter("bg-menu-color"), " ");  bgMenuColor[0] = new Color(ints[0], ints[1], ints[2]);  ints = parseInt(getParameter("bg-hi-menu-color"), " ");  bgMenuColor[1] = new Color(ints[0], ints[1], ints[2]); 
  // Create back buffer for double-buffering.  bbuf = createImage(size().width, size().height);  bbufG = bbuf.getGraphics(); 
  // Determine the font from the font-height.  int fh = Integer.parseInt(getParameter("font-height"));  int i = fh;  while (i > 10) {  f = new Font(getParameter("font"), Font.PLAIN, i);  fm = getFontMetrics(f);  if (fm.getHeight() <= fh) {  break;  }  i--;  } 
  // Get the menu parameters.  for (i=0; ; i++) {  if (getParameter("menu"+i) == null) {  hitArea = new Rectangle[i];  srcRect = new Rectangle[i];  dstPt = new Point[i];  url = new String[i];  down = new boolean[i];  itemUrl = new String[i][];  item = new String[i][]; 
 
  break;  }  } 
  for (i=0; i String[] fields = parse(getParameter("menu"+i), getParameter("separ  ator"));  // Get the hit area.  ints = parseInt(fields[0], " ");  hitArea[i] = new Rectangle(ints[0], ints[1], ints[2], ints[3]); 
  // Get the source image.  ints = parseInt(fields[1], " ");  srcRect[i] = new Rectangle(ints[0], ints[1], ints[2], ints[3]); 
  // Get the destination point.  ints = parseInt(fields[2], " ");  dstPt[i] = new Point(ints[0], ints[1]);  down[i] = fields[3].equals("d");  url[i] = fields[4]; 
  item[i] = new String[(fields.length-5)/2];  itemUrl[i] = new String[(fields.length-5)/2];  for (int j=0; j-  item[i][j] = fields[j*2+5]; 
 itemUrl[i][j] = fields[j*2+6];  }  }  } 
  // s is a string containing 'sep' separators. This method  // breaks up the string at the separators and returns the resulting  // strings in an array. The result may have zero length but is never null.  String[] parse(String s, String sep) {  StringTokenizer st = new StringTokenizer(s, sep);  String result[] = new String[st.countTokens()]; 
  for (int i=0; i result[i] = st.nextToken();  }  return result;  } 
  // This method is similar to parse() except that the strings are  // assumed to be decimal integers. This method coverts these integer  // strings into integers and returns them in an array.  // The result may have zero length but is never null.  int[] parseInt(String s, String sep) {  StringTokenizer st = new StringTokenizer(s, sep);  int[] result = new int[st.countTokens()]; 
  for (int i=0; i result[i] = Integer.parseInt(st.nextToken());  }  return result;  } 
  public void paint(Graphics g) {  imageDone = false;  update(g);  } 
  public void update(Graphics g) {  Graphics g2; 
  if (!imageDone) {  imageDone = g.drawImage(image, 0, 0, this);  return;  } 
  bbufG.setColor(bgColor);  bbufG.fillRect(0, 0, size().width, size().height);  bbufG.drawImage(image, 0, 0, this); 
  if (curMenu >= 0) {  g2 = bbuf.getGraphics();  // Paint the overlay image  g2.clipRect(dstPt[curMenu].x, dstPt[curMenu].y,  srcRect[curMenu].width, srcRect[curMenu].height);  g2.drawImage(image, dstPt[curMenu].x-srcRect[curMenu].x,  dstPt[curMenu].y-srcRect[curMenu].y, this);  g2.dispose(); 
  g2 = bbuf.getGraphics();  for (int i=0; i drawMenuItem(g2, i);  }  g2.dispose();  }  g.drawImage(bbuf, 0, 0, this);  } 
  void drawMenuItem(Graphics g, int i) {  int x, y, w, height;  // break the menu item label into lines.  String[] line = parse(item[curMenu][i], getParameter("newline")); 
  int hi = 0;  if (i == curMenuItem) {  hi = 1;  getAppletContext().showStatus(itemUrl[curMenu][i]);  }  g.setColor(bgMenuColor[hi]);  g.fillRect(menuItemRect[i].x, menuItemRect[i].y,  menuItemRect[i].width, menuItemRect[i].height); 
  // set color for text and box  g.setColor(fgMenuColor[hi]); 
  // draw box around menu item.  g.drawRect(menuItemRect[i].x, menuItemRect[i].y,  menuItemRect[i].width, menuItemRect[i].height); 
  // draw label  g.setFont(f);  y = menuItemRect[i].y + marginV;  for (i=0; i g.drawString(line[i],  menuItemRect[i].x+menuItemRect[i].width-fm.stringWidth(line[i])  -marginH, y + fm.getAscent());  y += fm.getHeight();  }  } 
  public boolean mouseExit(Event evt, int x, int y) {  curMenuItem = curMenu = -1;  repaint();  return true;  } 
  public boolean mouseEnter(Event evt, int x, int y) {  return mouseMove(evt, x, y);  } 
  public boolean mouseDown(Event evt, int x, int y) {  try {  String u = null; 
  if (curMenuItem >= 0 && itemUrl[curMenu].length > 0) {  u = itemUrl[curMenu][curMenuItem];  } else if (curMenu >= 0) {  u = url[curMenu];  }  if (u != null) {  URL url = new URL (getDocumentBase(), u); 
  if (getParameter("target") != null) {  getAppletContext().showDocument(url, getParameter("target")  ); } else {  getAppletContext().showDocument(url);  }  }  } catch (Exception e) {  e.printStackTrace();  }  return true;  } 
  public boolean mouseMove(Event evt, int x, int y) {  if (curMenu >= 0) {  int sm = inMenu(menuItemRect, x, y); 
  if (curMenuItem != sm) {  curMenuItem = sm;  repaint();  }  if (sm >= 0) {  return true;  }  curMenu = -1;  } 
  int m = inMenu(hitArea, x, y);  if (m != curMenu) {  curMenu = m; 
 
  // A new menu is now active so compute menuItemRect.  if (m >= 0) {  // Minimum width  int maxWidth = 50;  int maxHeight = 0; 
  menuItemRect = new Rectangle[item[curMenu].length];  for (int i=0; i String[] line = parse(item[curMenu][i], "^"); 
  for (int j=0; j int w = fm.stringWidth(line[j]);  if (w > maxWidth) {  maxWidth = w;  }  } 
  menuItemRect[i] = new Rectangle();  menuItemRect[i].height =  parse(item[curMenu][i], "^").length * fm.getHeight()  + 2 * marginV;  maxHeight += menuItemRect[i].height;  } 
  // Determine domain of submenus 
  // Add one extra pixel for the left edge.  maxWidth += 2 * marginH + 1;  if (down[m]) {  y = Math.max(0, Math.min(size().height-maxHeight-1,  dstPt[curMenu].y + srcRect[curMenu].height-1));  } else {  y = Math.max(0, Math.min(size().height-maxHeight-1,  dstPt[curMenu].y - maxHeight));  }  x = dstPt[curMenu].x + srcRect[curMenu].width-maxWidth-1;  for (int i=0; i-  menuItemRect[i].x = x; 
 menuItemRect[i].y = y;  menuItemRect[i].width = maxWidth;  y += menuItemRect[i].height;  }  getAppletContext().showStatus(url[curMenu]);  }  }  repaint();  }  return true;  } 
  // Returns the index of the rectangle in rs containing x and y.  // Returns -1 if either rs is null or x and y is not in rs.  int inMenu(Rectangle[] rs, int x, int y) {  if (rs != null) {  for (int i=0; i if (rs[i].inside(x, y)) {  return i;  }  }  }  return -1;  }  } 
 
  --  风雨送春归 .-+-.  飞雪迎春到 ___) | (___  已是悬崖万丈冰 `---'  犹有花枝俏 
  ※ 来源:·日月光华站 bbs.fudan.edu.cn·[FROM: ms]   
  
 
  | 
   
  
     | 
   
  
     相关文章:相关软件:  | 
   
   
      |