⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagemap.java

📁 This Source-Navigator, an IDE for C/C++/Fortran/Java/Tcl/PHP/Python and a host of other languages.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
     * The graphical highlight is achieved using the ButtonFilter.     */    public void highlight(Graphics g, boolean on) {	if (on) {	    setHighlight(pressed ? downImage : upImage);	}	super.highlight(g, on);	showStatus((on && anchor != null)		   ? "Go To " + anchor.toExternalForm()		   : null);    }    /**     * Since the highlight changes when the button is pressed, we need     * to record the "pressed" state and induce a repaint.     */    public void press() {	parent.repaint();	pressed = true;    }    /**     * The new URL is fetched when the user releases the mouse button     * only if they are still in the area.     */    public void lift(int x, int y) {	pressed = false;	parent.repaint();	if (inside(x, y) && anchor != null) {	    showDocument(anchor);	}    }}/** * An improved, round, "Fetch a URL" ImageArea class. * This class extends the HrefButtonArea Class to make the 3D button * a rounded ellipse.  All of the same feedback and operational * charactistics as the HrefButtonArea apply. * * @author 	Jim Graham * @version 	%I%, %G% */class RoundHrefButtonArea extends HrefButtonArea {    public void makeImages() {	upImage = parent.getHighlight(X, Y, W, H,				      new RoundButtonFilter(false,							    parent.hlpercent,							    border, W, H));	downImage = parent.getHighlight(X, Y, W, H,					new RoundButtonFilter(true,							      parent.hlpercent,							      border, W, H));    }}class HighlightFilter extends RGBImageFilter {    boolean brighter;    int percent;    public HighlightFilter(boolean b, int p) {	brighter = b;	percent = p;	canFilterIndexColorModel = true;    }    public int filterRGB(int x, int y, int rgb) {	int r = (rgb >> 16) & 0xff;	int g = (rgb >> 8) & 0xff;	int b = (rgb >> 0) & 0xff;	if (brighter) {	    r = (255 - ((255 - r) * (100 - percent) / 100));	    g = (255 - ((255 - g) * (100 - percent) / 100));	    b = (255 - ((255 - b) * (100 - percent) / 100));	} else {	    r = (r * (100 - percent) / 100);	    g = (g * (100 - percent) / 100);	    b = (b * (100 - percent) / 100);	}	if (r < 0) r = 0;	if (r > 255) r = 255;	if (g < 0) g = 0;	if (g > 255) g = 255;	if (b < 0) b = 0;	if (b > 255) b = 255;	return (rgb & 0xff000000) | (r << 16) | (g << 8) | (b << 0);    }}class ButtonFilter extends RGBImageFilter {    boolean pressed;    int defpercent;    int border;    int width;    int height;    ColorModel models[] = new ColorModel[7];    ColorModel origbuttonmodel;    public ButtonFilter(boolean press, int p, int b, int w, int h) {	pressed = press;	defpercent = p;	border = b;	width = w;	height = h;    }    public void setHints(int hints) {	super.setHints(hints & (~ImageConsumer.COMPLETESCANLINES));    }    public void setColorModel(ColorModel model) {	if (model instanceof IndexColorModel && true) {	    IndexColorModel icm = (IndexColorModel) model;	    models[0] = filterIndexColorModel(icm, false, false, 0);	    models[1] = filterIndexColorModel(icm, true, !pressed, defpercent);	    models[2] = null;	    if (pressed) {		models[3] = filterIndexColorModel(icm, true, false,						  defpercent/2);	    } else {		models[3] = models[0];	    }	    models[4] = null;	    models[5] = filterIndexColorModel(icm, true, pressed, defpercent);	    models[6] = models[0];	    origbuttonmodel = model;	    consumer.setColorModel(models[3]);	} else {	    super.setColorModel(model);	}    }    public IndexColorModel filterIndexColorModel(IndexColorModel icm,						 boolean opaque,						 boolean brighter,						 int percent) {	byte r[] = new byte[256];	byte g[] = new byte[256];	byte b[] = new byte[256];	byte a[] = new byte[256];	int mapsize = icm.getMapSize();	icm.getReds(r);	icm.getGreens(g);	icm.getBlues(b);	if (opaque) {	    icm.getAlphas(a);	    for (int i = 0; i < mapsize; i++) {		int rgb = filterRGB(icm.getRGB(i), brighter, percent);		a[i] = (byte) (rgb >> 24);		r[i] = (byte) (rgb >> 16);		g[i] = (byte) (rgb >> 8);		b[i] = (byte) (rgb >> 0);	    }	}	return new IndexColorModel(icm.getPixelSize(), mapsize, r, g, b, a);    }    /**     * Define the ranges of varying highlight for the button.     * ranges is an array of 8 values which split up a scanline into     * 7 different regions of highlighting effect:     *     * ranges[0-1] = area outside of left edge of button     * ranges[1-2] = area inside UpperLeft highlight region left of center     * ranges[2-3] = area requiring custom highlighting left of center     * ranges[3-4] = area inside center of button     * ranges[4-5] = area requiring custom highlighting right of center     * ranges[5-6] = area inside LowerRight highlight region right of center     * ranges[6-7] = area outside of right edge of button     *     * Note that ranges[0-1] and ranges[6-7] are empty where the edges of     * the button touch the left and right edges of the image (everywhere     * on a square button) and ranges[2-3] and ranges[4-5] are only nonempty     * in those regions where the UpperLeft highlighting has leaked over     * the "top" of the button onto parts of its right edge or where the     * LowerRight highlighting has leaked under the "bottom" of the button     * onto parts of its left edge (can't happen on square buttons, happens     * occasionally on round buttons).     */    public void buttonRanges(int y, int ranges[]) {	ranges[0] = ranges[1] = 0;	if (y < border) {	    ranges[2] = ranges[3] = ranges[4] = ranges[5] = width - y;	} else if (y > height - border) {	    ranges[2] = ranges[3] = ranges[4] = ranges[5] = height - y;	} else {	    ranges[2] = ranges[3] = border;	    ranges[4] = ranges[5] = width - border;	}	ranges[6] = ranges[7] = width;    }    public void setPixels(int x, int y, int w, int h,			  ColorModel model, byte pixels[], int off,			  int scansize) {	if (model == origbuttonmodel) {	    int ranges[] = new int[8];	    int x2 = x + w;	    for (int cy = y; cy < y + h; cy++) {		buttonRanges(cy, ranges);		for (int i = 0; i < 7; i++) {		    if (x2 > ranges[i] && x < ranges[i+1]) {			int cx1 = Math.max(x, ranges[i]);			int cx2 = Math.min(x2, ranges[i+1]);			if (models[i] == null) {			    super.setPixels(cx1, cy, cx2 - cx1, 1,					    model, pixels,					    off + (cx1 - x), scansize);			} else {			    if (cx1 < cx2) {				consumer.setPixels(cx1, cy, cx2 - cx1, 1,						   models[i], pixels,						   off + (cx1 - x), scansize);			    }			}		    }		}		off += scansize;	    }	} else {	    super.setPixels(x, y, w, h, model, pixels, off, scansize);	}    }    public int filterRGB(int x, int y, int rgb) {	boolean brighter;	int percent;	if ((x < border && y < height - x) || (y < border && x < width - y)) {	    brighter = !pressed;	    percent = defpercent;	} else if (x >= width - border || y >= height - border) {	    brighter = pressed;	    percent = defpercent;	} else if (pressed) {	    brighter = false;	    percent = defpercent / 2;	} else {	    return rgb & 0x00ffffff;	}	return filterRGB(rgb, brighter, percent);    }    public int filterRGB(int rgb, boolean brighter, int percent) {	int r = (rgb >> 16) & 0xff;	int g = (rgb >> 8) & 0xff;	int b = (rgb >> 0) & 0xff;	if (brighter) {	    r = (255 - ((255 - r) * (100 - percent) / 100));	    g = (255 - ((255 - g) * (100 - percent) / 100));	    b = (255 - ((255 - b) * (100 - percent) / 100));	} else {	    r = (r * (100 - percent) / 100);	    g = (g * (100 - percent) / 100);	    b = (b * (100 - percent) / 100);	}	if (r < 0) r = 0;	if (g < 0) g = 0;	if (b < 0) b = 0;	if (r > 255) r = 255;	if (g > 255) g = 255;	if (b > 255) b = 255;	return (rgb & 0xff000000) | (r << 16) | (g << 8) | (b << 0);    }}class RoundButtonFilter extends ButtonFilter {    int Xcenter;    int Ycenter;    int Yradsq;    int innerW;    int innerH;    int Yrad2sq;    public RoundButtonFilter(boolean press, int p, int b, int w, int h) {	super(press, p, b, w, h);	Xcenter = w/2;	Ycenter = h/2;	Yradsq = h * h / 4;	innerW = w - border * 2;	innerH = h - border * 2;	Yrad2sq = innerH * innerH / 4;    }    public void buttonRanges(int y, int ranges[]) {	int yrel = Math.abs(Ycenter - y);	int xrel = (int) (Math.sqrt(Yradsq - yrel * yrel) * width / height);	int xslash = width - (y * width / height);	ranges[0] = 0;	ranges[1] = Xcenter - xrel;	ranges[6] = Xcenter + xrel;	ranges[7] = width;	if (y < border) {	    ranges[2] = ranges[3] = ranges[4] = Xcenter;	    ranges[5] = ranges[6];	} else if (y + border >= height) {	    ranges[2] = ranges[1];	    ranges[3] = ranges[4] = ranges[5] = Xcenter;	} else {	    int xrel2 = (int) (Math.sqrt(Yrad2sq - yrel * yrel)			       * innerW / innerH);	    ranges[3] = Xcenter - xrel2;	    ranges[4] = Xcenter + xrel2;	    if (y < Ycenter) {		ranges[2] = ranges[3];		ranges[5] = ranges[6];	    } else {		ranges[2] = ranges[1];		ranges[5] = ranges[4];	    }	}    }    private int savedranges[];    private int savedy;    private synchronized int[] getRanges(int y) {	if (savedranges == null || savedy != y) {	    if (savedranges == null) {		savedranges = new int[8];	    }	    buttonRanges(y, savedranges);	    savedy = y;	}	return savedranges;    }    public int filterRGB(int x, int y, int rgb) {	boolean brighter;	int percent;	int i;	int ranges[] = getRanges(y);	for (i = 0; i < 7; i++) {	    if (x >= ranges[i] && x < ranges[i+1]) {		break;	    }	}	double angle;	switch (i) {	default:	case 0:	case 6:	    return rgb & 0x00ffffff;	case 1:	    brighter = !pressed;	    percent = defpercent;	    break;	case 5:	    brighter = pressed;	    percent = defpercent;	    break;	case 2:	    angle = Math.atan2(y - Ycenter, Xcenter - x);	    percent = defpercent - ((int) (Math.cos(angle) * 2 * defpercent));	    if (!pressed) {		percent = -percent;	    }	    if (percent == 0) {		return rgb;	    } else if (percent < 0) {		percent = -percent;		brighter = false;	    } else {		brighter = true;	    }	    break;	case 4:	    angle = Math.atan2(Ycenter - y, x - Xcenter);	    percent = defpercent - ((int) (Math.cos(angle) * 2 * defpercent));	    if (pressed) {		percent = -percent;	    }	    if (percent == 0) {		return rgb;	    } else if (percent < 0) {		percent = -percent;		brighter = false;	    } else {		brighter = true;	    }	    break;	case 3:	    if (!pressed) {		return rgb & 0x00ffffff;	    }	    brighter = false;	    percent = defpercent;	    break;	}	return filterRGB(rgb, brighter, percent);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -