drawrepl.java

来自「JGRoups源码」· Java 代码 · 共 347 行

JAVA
347
字号
// $Id: DrawRepl.java,v 1.7 2005/07/17 11:36:42 chrislott Exp $package org.jgroups.demos;import org.jgroups.Channel;import org.jgroups.JChannel;import org.jgroups.blocks.GroupRequest;import org.jgroups.blocks.MethodCall;import org.jgroups.blocks.RpcDispatcher;import java.awt.*;import java.awt.event.*;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.DataOutputStream;import java.util.Hashtable;import java.util.Random;/** * * Replicates the whiteboard demo by intercepting central AWT event queue and mcasting events to * all members. Not very useful in all cases, e.g. when the "Leave" button is pressed, and this event * is broadcast to all members, all members will leave ! This demo would clearly benefit from more work ! * NOT SUPPORTED ! */public class DrawRepl implements MouseMotionListener, WindowListener, ActionListener,				 Runnable {    private Graphics               graphics=null;    private Frame                  mainFrame=null;    private Panel                  panel=null, sub_panel=null;    private final byte[]                   buf=new byte[128];    private final ByteArrayOutputStream  out=new ByteArrayOutputStream();    private DataOutputStream       outstream;    private ByteArrayInputStream   inp;    private DataInputStream        instream;    private int                    x, y;    private final Hashtable              colors=new Hashtable();    private final Random                 random=new Random(System.currentTimeMillis());    private int                    col_val=1;    private Color                  current_color=Color.red;    private Button                 clear_button, leave_button;    private final String                 groupname="DrawReplGroup";    private final Font             default_font=new Font("Helvetica",Font.PLAIN,12);    private EventQueue             event_queue=null;    private Thread                 mythread=null;    private RpcDispatcher          dispatcher;    private Channel                channel;    public DrawRepl() {	colors.put(new Integer(1),  Color.white);	colors.put(new Integer(2),  Color.black);	colors.put(new Integer(3),  Color.red);	colors.put(new Integer(4),  Color.orange);	colors.put(new Integer(5),  Color.green);	colors.put(new Integer(6),  Color.magenta);	colors.put(new Integer(7),  Color.cyan);	colors.put(new Integer(8),  Color.blue);	mythread=new Thread(this);	try {	    channel=new JChannel();	    dispatcher=new RpcDispatcher(channel, null, null, this);	    channel.connect(groupname);	}	catch(Exception e) {	    System.err.println(e);	    System.exit(0);	}    }    public static void main(String[] args) {	DrawRepl draw=new DrawRepl();	draw.go();    }    private Color SelectColor() {	col_val=(Math.abs(random.nextInt()) % 8)+1;	Color ret=(Color)colors.get(new Integer(col_val));	if(ret == null)	    ret=Color.red;	return ret;    }    AWTEvent copyEvent(Component src, AWTEvent evt) {	if(evt instanceof MouseEvent) {	    MouseEvent mev=(MouseEvent)evt;	    return new MouseEvent(src, evt.getID(), mev.getWhen(), mev.getModifiers(),				  mev.getX(), mev.getY(), mev.getClickCount(),				  mev.isPopupTrigger());	}	if(evt instanceof KeyEvent) {	    KeyEvent kev=(KeyEvent)evt;	    return new KeyEvent(src, evt.getID(), kev.getWhen(), kev.getModifiers(), 				kev.getKeyCode(), kev.getKeyChar());	}	if(evt instanceof ActionEvent)	    return new ActionEvent(src, evt.getID(), ((ActionEvent)evt).getActionCommand(),				   ((ActionEvent)evt).getModifiers());	if(evt instanceof PaintEvent)	    return new PaintEvent(src, evt.getID(), ((PaintEvent)evt).getUpdateRect());	if(evt instanceof FocusEvent)	    return new FocusEvent(src, evt.getID(), ((FocusEvent)evt).isTemporary());	if(evt instanceof ComponentEvent)	    return new ComponentEvent(src, evt.getID());					return null;    }    void dispatch(Object src, AWTEvent evt) { 	if (src instanceof Component) 	    ((Component)src).dispatchEvent(evt);	else if (src instanceof MenuComponent) 	    ((MenuComponent)src).dispatchEvent(evt); 	else 	    System.err.println("++++++++++");    }        public Component findComponent(Container parent, String comp_name) {	Component  retval=null;	if(comp_name != null && comp_name.equals(parent.getName()))	    return parent;	int ncomponents = parent.getComponentCount();        Component components[] = parent.getComponents();	for (int i = ncomponents-1 ; i >= 0; i--) {	    Component comp = components[i], tmp;	    if (comp != null) {		if(comp instanceof Container) {		    retval=findComponent((Container)comp, comp_name);		    if(retval != null)			return retval;		}		else if(comp_name.equals(comp.getName()))		    return comp;	    }	}	return retval;    }    // public void setSize(Integer x, Integer y) {    //   mainFrame.setSize(new Dimension(x.intValue(), y.intValue()));    // }    /* Called by Dispatcher */    public void processEvent(String comp_name, AWTEvent evt) {	AWTEvent   copy_evt=null;	Component  src=findComponent(mainFrame, comp_name);	if(src == null) {	    System.err.println("processEvent(): src is null");	    return;	}	System.out.println("Received " + evt.getClass().getName());	copy_evt=copyEvent(src, evt);	if(copy_evt == null) {	    System.err.println("copy_evt is NULL");	    return;	}	dispatch(src, copy_evt);// 	if(evt instanceof ComponentEvent && evt.getID() == ComponentEvent.COMPONENT_RESIZED) {// 	    Dimension dim=mainFrame.getSize();// 	    try {// 		dispatcher.sendGetN(groupname, "setSize", new Integer(dim.height),// 				    new Integer(dim.width), 0, 0);// 	    }// 	    catch(Exception e) {// 		System.err.println(e);// 	    }// 	}    }    void processLocally(AWTEvent evt) {	dispatch(evt.getSource(), evt);    }    public void run() {	String comp_name;		while(true) {	    try {		AWTEvent evt=event_queue.getNextEvent();		Object obj=evt.getSource();		if(obj == null) {		    System.err.println("src is NULL");		    continue;		}				if(obj instanceof Component)		    comp_name=((Component)obj).getName();		else if(obj instanceof MenuComponent)		    comp_name=((MenuComponent)obj).getName();		else {		    System.err.println("src is of type " + obj.getClass().getName());		    continue;		}		if(evt instanceof FocusEvent || evt instanceof PaintEvent) {		    System.out.println(evt.getClass().getName() + " not copied");		    processLocally(evt);		    continue;		}		System.out.println("MCasting "+evt.getClass().getName()+" event...");		MethodCall call = new MethodCall("processEvent", new Object[] {comp_name, evt},             new String[] {String.class.getName(), AWTEvent.class.getName()});		dispatcher.callRemoteMethods(null, call, GroupRequest.GET_NONE, 0);	    }	    catch(Exception e) {		System.err.println(e);	    }	}    }	    public void go() {	mainFrame=new Frame();	panel=new Panel();	sub_panel=new Panel();		event_queue=mainFrame.getToolkit().getSystemEventQueue();	mythread.start();		mainFrame.setSize(200,200);	mainFrame.add("Center", panel);	clear_button=new Button("Clear");	clear_button.setFont(default_font);	clear_button.addActionListener(this);	leave_button=new Button("Exit");	leave_button.setFont(default_font);	leave_button.addActionListener(this);	sub_panel.add("South", clear_button);	sub_panel.add("South", leave_button);	mainFrame.add("South", sub_panel);	mainFrame.addWindowListener(this);	// mainFrame.addComponentListener(this);	panel.addMouseMotionListener(this);	mainFrame.setVisible(true);	graphics=panel.getGraphics();	current_color=SelectColor();	if(current_color == null)	    current_color=Color.red;	graphics.setColor(current_color);    }    /* --------------- Callbacks --------------- */    public void mouseMoved(MouseEvent e) {    }    public void mouseDragged(MouseEvent e) {	x=e.getX();	y=e.getY();	graphics.fillOval(x, y, 10, 10);    }    public void clearPanel() {	System.out.println("CLEAR");	Rectangle  bounds=panel.getBounds();	graphics.clearRect(0, 0, bounds.width, bounds.height);	    }    public void windowActivated(WindowEvent e) {}    public void windowClosed(WindowEvent e) {}    public void windowClosing(WindowEvent e) {	System.exit(0);    }    public void windowDeactivated(WindowEvent e) {}    public void windowDeiconified(WindowEvent e) {}    public void windowIconified(WindowEvent e) {}    public void windowOpened(WindowEvent e) {}//     public void componentResized(ComponentEvent e) {// 	System.out.println("RESIZED, size is " + mainFrame.getBounds());//     }//     public void componentMoved(ComponentEvent e) {// 	System.out.println("MOVED, location is: " + mainFrame.getLocation());//     }//     public void componentShown(ComponentEvent e) {}//     public void componentHidden(ComponentEvent e) {}    public void actionPerformed(ActionEvent e) {	String command=e.getActionCommand();	if("Clear".equals(command))	    clearPanel();	else if("Exit".equals(command)) {	    mainFrame.setVisible(false);	    System.exit(0);	}	else	    System.out.println("Unknown action");    }}

⌨️ 快捷键说明

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