imagelabel.java

来自「一个简单的visio程序。」· Java 代码 · 共 462 行

JAVA
462
字号
package webide.views.toolbox;

import java.awt.Canvas;
import java.awt.Window;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Component;
import java.awt.AWTEvent;
import java.awt.AWTEventMulticaster;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Point;
import java.awt.FontMetrics;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;

public class ImageLabel extends Canvas {
	private  Image[]              images = null;
	private  transient int        loop;
	private  boolean              stopped = true;
	private  int                  id = -1 ;
	private  int                  w, h    ;
	private  int                  state   ;
	private  String               name           = null ;
	private  String               showname       = null ;
	private  static  ImageLabel   tBCB, enter;
	private  static  boolean      press = false;
	private  boolean              isEnable;
	private  ActionListener       actionListener;
	private  int                  mode = 0;

    public Dimension getPreferredSize() {
        return new Dimension(32,32);
    }
   
	public ImageLabel() {
		id = -1;
		state = 1;
		setSize(32, 32);
		enableEvents(AWTEvent.MOUSE_EVENT_MASK);
	}

	public ImageLabel(Image image){
		this();
		Image[] imgs = new Image[2];

		for(int i = 0; i < 2; i++) {
			imgs[i] = image;
		}
		setImages(imgs);
		mode = 1;
	}



	/**
	* Set state images - 2 images.
	*/
	public void setImages(Image[] images)
	{
		this.images = images;
	}

	public Image[] getImages() {
		return images;
	}

	public void addActionListener(ActionListener listener) {
		actionListener = AWTEventMulticaster.add(actionListener, listener);
		enableEvents(AWTEvent.MOUSE_EVENT_MASK);
	}

	public void removeActionListener(ActionListener listener) {
		actionListener = AWTEventMulticaster.remove(actionListener, listener);
	}

	public void processMouseEvent(MouseEvent e) {
		switch(e.getID()) {
			case MouseEvent.MOUSE_PRESSED:
				mousePressed(e);
				break;

			case MouseEvent.MOUSE_CLICKED:
				mouseClicked(e);
				break;

			case MouseEvent.MOUSE_RELEASED:
				mouseReleased(e);
				break;

			case MouseEvent.MOUSE_ENTERED:
				mouseEntered(e);
				break;

			case MouseEvent.MOUSE_EXITED:
				mouseExited(e);
				break;
		}
		super.processMouseEvent(e);
	}    // end of processMouseEvent.    
    
    public void  setName(String name) {
        this.name  =  name;
        showname   =  name;
        
		int ind    =  name.lastIndexOf(".");
        if (ind != -1) 
			showname = name.substring(ind+1);
        
		int index  =  name.lastIndexOf("(");
        if (index != -1)
			showname = name.substring(0,index-1);
    }

    public String  getName()  {
        return name;
    }

    private String getShowName(){
        return showname;
    }

    public int     getId()    {
        return id;
    }

    public void setId(int index) {
        id = index;
    }


    public int     getState() {
        return state;
    }

    public static void setSelectTbcb(ImageLabel b){
        tBCB = b;
    }

    public static ImageLabel getSelectTbcb(){
        return tBCB;
    }

    public void update(Graphics g) {
        paint(g);
    }

    Image offImg = null;

    public void paint(Graphics g) {
		Dimension d = getSize();
		if(offImg == null) {
			offImg = createImage(d.width, d.height);
		}
		
		Graphics offGfx = offImg.getGraphics();
		Image img = null;
		if(state == 2) {
			if(img == null && images != null){
				img = images[1];
			}
			else if(images != null){
				img = images[1];
			}
		}
		else if(images != null) {
			if(state == 4) {
				img = images[0];
			}
			else {
				img = images[1];
			}
		}
		
		int w = 0, h = 0, dx1 = 0,dy1 = 0, dx2 = 0, dy2 = 0, sx1 = 0, sy1 = 0, sx2 = 0, sy2 = 0;
    
		if(img != null) {
			w = img.getWidth(this);
			h = img.getHeight(this);
			dx1 = Math.max(0, (d.width - w) / 2);
			dy1 = Math.max(0, (d.height - h) / 2);
			dx2 = Math.min(d.width, dx1 + w);
			dy2 = Math.min(d.height, dy1 + h);
			sx1 = Math.max(0, (w - d.width) / 2);
			sy1 = Math.max(0, (h - d.height) / 2);
			sx2 = Math.min(sx1 + w, sx1 + d.width);
			sy2 = Math.min(sy1 + h, sy1 + d.height);
		}
		switch (getState()) {
            case  1 : 
            {
                offGfx.setColor(getBackground());
                offGfx.fillRect(0, 0, d.width, d.height);
                if(img != null) {
					offGfx.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
				}
				break;
            }
            
			case  2 : 
            {
                offGfx.setColor(getBackground());
                offGfx.fillRect(0, 0, d.width, d.height);
                if(img != null) {
					offGfx.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
				}
                offGfx.setColor(Color.white);
                offGfx.drawLine(0,0,0,d.height);
                offGfx.drawLine(0,0,d.width,0);
                offGfx.drawLine(d.width,0,d.width,d.height);
                offGfx.drawLine(0,d.height,d.width,d.height);
                offGfx.setColor(Color.gray);
                offGfx.drawLine(d.width-1,1,d.width-1,d.height-1);
                offGfx.drawLine(1,d.height-1,d.width-1,d.height-1);
                offGfx.drawLine(d.width,0,d.width,d.height);
                offGfx.drawLine(0,d.height,d.width,d.height);
				break;
            }

            case  3 : 
			{
				Color color;
				if(id != -1) {
					color = Color.lightGray;
				}
				else {
					color = new Color(220,220,220);
				}
				
				offGfx.setColor(color);
				offGfx.fillRect(0, 0, d.width, d.height);
				if(img != null) {
					offGfx.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
				}
				
				offGfx.setColor(Color.gray);
				offGfx.drawLine(0,0,0,d.height);
				offGfx.drawLine(0,0,d.width,0);
				offGfx.setColor(Color.white);
				offGfx.drawLine(d.width-1,1,d.width-1,d.height-1);
				offGfx.drawLine(1,d.height-1,d.width-1,d.height-1);
				break;
            }

            case  4 : 
			{
                offGfx.setColor(getBackground());
                offGfx.fillRect(0, 0, d.width, d.height);
                if(img != null) {
					offGfx.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
				}

				if(id != -1) break;
                offGfx.setColor(Color.gray);
                offGfx.drawLine(0,0,0,d.height);
                offGfx.drawLine(0,0,d.width,0);
                offGfx.setColor(Color.white);
                offGfx.drawLine(d.width-1,1,d.width-1,d.height-1);
                offGfx.drawLine(1,d.height-1,d.width-1,d.height-1);
			}
        }
        g.drawImage(offImg, 0, 0, this);
        offGfx.dispose();
    }

    public void tmpstate1() {
		if(enter == this) {
			setState(2);
		}
		else {
			setState(1);
		}
    }

    public void tmpstate2() {
		setState(2);
    }

    public void tmpstate3() {
        setState(3);
    }

    public void tmpstate4() {
        setState(4);
    }

    public void setState(int status) {
        if(state == status) return;
        state = status;
        if(isShowing()) {
            repaint();
        }
    }

    void drawFrame(Image img) {
        Graphics g = getGraphics();
        if(g == null) return;
        Dimension s = getSize();
        if(offImg == null) {
            offImg = createImage(s.width, s.height);
        }
        
		Graphics offGfx = offImg.getGraphics();
        int w = img.getWidth(this);
        int h = img.getHeight(this);
        int dx1 = Math.max(0, (s.width - w) / 2);
        int dy1 = Math.max(0, (s.height - h) / 2);
        int dx2 = Math.min(s.width, dx1 + w);
        int dy2 = Math.min(s.height, dy1 + h);
        int sx1 = Math.max(0, (w - s.width) / 2);
        int sy1 = Math.max(0, (h - s.height) / 2);
        int sx2 = Math.min(sx1 + w, sx1 + s.width);
        int sy2 = Math.min(sy1 + h, sy1 + s.height);

        if(dx1 == 0) 
        {
            dx1 += 1;
            sx1 += 1;
            dx2 -= 1;
            sx2 -= 1;
        }
        if(dy1 == 0) 
        {
            dy1 += 1;
            sy1 += 1;
            dx2 -= 1;
            dy2 -= 1;
        }

        offGfx.setColor(getBackground());
        offGfx.fillRect(1, 1, s.width - 2, s.height - 2);
        offGfx.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, this);
		g.drawImage(offImg, 0, 0, this);
		offGfx.dispose();
    }

    public Frame getFrame() {
        Frame frame = null;
        try{
			Container parent = getParent();
			while (!(parent instanceof java.awt.Frame)) {
				parent = parent.getParent();
			}
			if (parent != null) 
				frame = (java.awt.Frame)parent;
        }catch (Exception e) {}
        return frame;
    }

    public void mouseClicked(MouseEvent evt)  {}

    public void mouseEntered (MouseEvent event) {
        if (id == -2) return;
        mouseEnteredchangestate(id);

        webide.MainConsole mM = webide.MainConsole.getMainConsole();
        mM.showStatus(showname);
    }


    private void mouseEnteredchangestate(int id){
        enter  = this;
        if(state == 2) return;
        if (id != -1){
            if ( getState()==4 )return;
            if (press)
                 tmpstate3();
            else tmpstate2();
        }else{
            switch(state){
            case 1:tmpstate2();break;
            case 3:tmpstate4();break;
            default :;
            }
        }
    }

    public void mouseExited(MouseEvent event) {
        if (id == -2) return;
        webide.MainConsole mM = webide.MainConsole.getMainConsole();
        if (mM != null) {
	        mM.showStatus("");
        }
        mouseExitedchangestate(id);
    }

    private void mouseExitedchangestate(int id){
        enter = null;
        if(state == 1) return;
        if (id != -1){
        if ( getState()==4 )return;
        setState(1);
        }else{
            switch(state){
            case 2: setState(1); break;
            case 4: tmpstate3(); break;
            default :;
            }
        }
    }

    public void mousePressed(MouseEvent event) {
        int ind = event.getModifiers();
        if (ind == java.awt.event.InputEvent.BUTTON3_MASK) return;
        if (id == -2) return;
        mousePressedchangestate(id,event);
    }

    ToolBox tbp = null;
    private synchronized void mousePressedchangestate(int id,MouseEvent e){

        Component parent = getParent();
        if (parent instanceof ToolBox){
            tbp = (ToolBox)parent;
            Object obj = e.getSource();
            tbp.mreleased(obj);
        }
        if(state == 3) return;
        if (id != -1){
            if ( getState()==4 )return;
            tmpstate3();
            press = true; // this ;
        }else{
            if ((tBCB!=null)&&(tBCB!=this)) {
        tBCB.setState(1);
        }
            tmpstate3();
            tBCB = this;
        }
    }

    public void mouseReleased(MouseEvent evt){
        int ind = evt.getModifiers();
        if (ind == java.awt.event.InputEvent.BUTTON3_MASK) return;
        if (id == -2) return;
        if (id != -1){
            if ( getState()==4 )return;
            synchronized(this){
                if (enter == this ) isEnable = true;
                if (enter != null && enter == this){
                    enter.tmpstate2();
                }
                press = false; // null;
            }
        }
        else{;}
        if (!(id != -1  && getState() == 4) && actionListener != null && isEnable) {
           isEnable  =  false ;
           actionListener.actionPerformed(new ActionEvent(
               this, ActionEvent.ACTION_PERFORMED, name));
        }
    }

}


⌨️ 快捷键说明

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