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

📄 sketchview.java

📁 用Java实现的网络画图程序
💻 JAVA
字号:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.net.*;
import java.io.*;

class SketchView extends JComponent implements Observer,Constants,ActionListener,Printable{
	private Sketcher app;
	private Element hightLightElement;
	private Element selectedElement;
	private JPopupMenu elementPopup=new JPopupMenu("element");
	private JMenuItem moveItem,deleteItem,rotateItem,sendToBackItem,rotateAllItem,stopItem,exitItem;
	private int mode=NORMAL;
	private double scale=1;
	boolean scaleState=false;
	RotateThread rotateT;
	SocketClient chatClient;
	//MulticastSocket ms;
	//InetAddress ia;
	//InetAddress local;
	//int port=4000;

	class Mousehandler extends MouseInputAdapter{
		private Point start;
		private Point last;
		private Element tempElement;
		private Graphics2D g2d;
		
		public void mousePressed(MouseEvent e){
			start=e.getPoint();
			int modifier=e.getModifiers();
			if((modifier&e.BUTTON1_MASK)!=0){
				g2d=(Graphics2D)getGraphics();
				g2d.setXORMode(getBackground());
				g2d.setPaint(app.getWindow().getElementColor());
			}
		
		
		}


		public void mouseDragged(MouseEvent e){
			last=e.getPoint();
			int modifier=e.getModifiers();
			if((modifier&e.BUTTON1_MASK)!=0&&(app.getWindow().getElementType()!=TEXT)&&(mode==NORMAL)){
				if(tempElement==null){
					tempElement=createElement(start,last);
				}
				else{	
					if(!(tempElement.getClass()== Element.Curve.class))
						tempElement.draw(g2d);
					tempElement.nodify(start,last);
				}
				tempElement.draw(g2d);
			}
			else if(mode==MOVE&&selectedElement!=null){
				selectedElement.draw(g2d);
				selectedElement.move(last.x-start.x,last.y-start.y);
				selectedElement.draw(g2d);
				start=last;
			}
			else if(mode==ROTATE&&selectedElement!=null){
				selectedElement.draw(g2d);
				selectedElement.rotate(getAngle(selectedElement.getPosition(),start,last));
				selectedElement.draw(g2d);
				start=last;
			}


			
		}

		public void mouseReleased(MouseEvent e){
			
			int modifier=e.getModifiers();
			if(e.isPopupTrigger()){
				start=e.getPoint();
				if(hightLightElement==null)
					app.getWindow().getPopup().show((Component)e.getSource(),start.x,start.y);
				else
					elementPopup.show((Component)e.getSource(),start.x,start.y);
				start=null;
			}
				
			else if((modifier&e.BUTTON1_MASK)!=0&&(app.getWindow().getElementType()!=TEXT)&&(mode==NORMAL)){
				if(mode!=ROTATE_ALL){
				if(tempElement!=null){
					app.getModel().add(tempElement);
					//send(tempElement);
					chatClient.broadcastElement(tempElement);
					tempElement=null;
				}
				else if(mode==MOVE||mode==ROTATE){
					if(selectedElement!=null)
						repaint();
					
				}
				if(g2d!=null){
					g2d.dispose();
					g2d=null;
				}
				start=last=null;
				
				
			}		}
			selectedElement=tempElement=null;


		}

		public void mouseMoved(MouseEvent e){
			if(mode!=ROTATE_ALL){
			Point currentPoint=e.getPoint();
			app.getWindow().getStatusBar().setXY(currentPoint);
			Iterator elements=app.getModel().getIterator();
			Element element;
			
			while(elements.hasNext()){
				element=(Element)elements.next();
				if(element.getBounds().contains(currentPoint)){
					if(element==hightLightElement)
						return;
					g2d=(Graphics2D)getGraphics();
					if(hightLightElement!=null){
						hightLightElement.setHightLight(false);
						hightLightElement.draw(g2d);
					}
					element.setHightLight(true);
					hightLightElement=element;
					selectedElement=hightLightElement;
					element.draw(g2d);
					g2d.dispose();
					g2d=null;
					return;
				}
			}
			if(hightLightElement!=null){
				g2d=(Graphics2D)getGraphics();
				hightLightElement.setHightLight(false);
				hightLightElement.draw(g2d);
				hightLightElement=null;
				g2d.dispose();
				g2d=null;
			}

			
						
			
		}
		
		}

	

		public void mouseEntered(MouseEvent e){
			if(mode!=ROTATE_ALL){
			if(scaleState){
				scale=1;
				app.getWindow().resetScale(scale);
				repaint();
				scaleState=false;
			}
		}
		}

		public void mouseClicked(MouseEvent e){
			
			
			int modifier=e.getModifiers();
			if((modifier&e.BUTTON1_MASK)!=0&&(app.getWindow().getElementType()==TEXT)){
				start=e.getPoint();
				String text=JOptionPane.showInputDialog((Component)e.getSource(),"标注文本","标注",JOptionPane.PLAIN_MESSAGE);
				if(text!=null){
					g2d=(Graphics2D)getGraphics();
					Font font=app.getWindow().getFont();
					Rectangle bounds=font.getStringBounds(text,g2d.getFontRenderContext()).getBounds();
					 System.out.println(text);
					tempElement=new Element.Text(font,text,start,app.getWindow().getElementColor(),bounds );
					if(tempElement!=null)
						app.getModel().add(tempElement);
					tempElement=null;
					g2d.dispose();
					g2d=null;
					start=null;
				}
			}

		
		}
	
	
	private double getAngle(Point position,Point start,Point last){
		double prep=Line2D.ptLineDist(position.x,position.y,start.x,start.y,last.x,last.y) ;
		double hy=position.distance(start);
		if(hy==0)	
			hy=1.0;
		return -Line2D.relativeCCW(position.x,position.y,start.x,start.y,last.x,last.y)*Math.asin(prep/hy);
	}


	private Element createElement(Point start,Point last){
		switch(app.getWindow().getElementType()){
			case LINE:
				return new Element.Line(start,last,app.getWindow().getElementColor());
			case RECTANGLE:
				return new Element.Rectangle(start,last,app.getWindow().getElementColor());
			case CIRCLE:
				return new Element.Circle(start,last,app.getWindow().getElementColor());
			case CURVE:
				return new Element.Curve(start,last,app.getWindow().getElementColor());
			case ELLIPSE:
				return new Element.Ellipse(start,last,app.getWindow().getElementColor());
		}
		return null;
	}
	}
	

	public SketchView(Sketcher app){
		
		this.app=app;
		
		initPopupMenu();
		
		Mousehandler handler=new Mousehandler();
		addMouseListener(handler);
		addMouseMotionListener(handler);
		//initmulticast();
	}
	

	public void addChat(SocketClient chatClient){
		this.chatClient=chatClient;
	}


	private void initPopupMenu(){
		moveItem=elementPopup.add("移动");
		deleteItem=elementPopup.add("删除");
		rotateItem=elementPopup.add("旋转");
		sendToBackItem=elementPopup.add("移到下一层");
		rotateAllItem=elementPopup.add("动态旋转");
		stopItem=elementPopup.add("停止旋转");
		exitItem=elementPopup.add("退出");
		moveItem.addActionListener(this);
		deleteItem.addActionListener(this);
		rotateItem.addActionListener(this);
		sendToBackItem.addActionListener(this);
		rotateAllItem.addActionListener(this);
		rotateAllItem.setEnabled(true);
		stopItem.addActionListener(this);
		stopItem.setEnabled(false);
		exitItem.addActionListener(this);
	}

	public void actionPerformed(ActionEvent e){
		Object source=e.getSource();
		if(source==moveItem){
			mode=MOVE;
			selectedElement=hightLightElement;
			
		
		}
		else if(source==deleteItem){
			if(hightLightElement!=null){
				app.getModel().remove(hightLightElement);
				hightLightElement=null;
			}
		}
		else if(source==rotateItem){
			mode=ROTATE;
			selectedElement=hightLightElement;

		
		}
		else if(source==sendToBackItem){
			if(hightLightElement!=null){
				app.getModel().remove(hightLightElement);
				app.getModel().add(hightLightElement);
				hightLightElement.setHightLight(false);
				hightLightElement=null;
				repaint();
			}
		
		}
		else if(source==rotateAllItem){
			
				rotateT=new  RotateThread();
				rotateT.setDaemon(true);
			
			stopItem.setEnabled(true);
			rotateAllItem.setEnabled(false);
			mode=ROTATE_ALL;
			rotateT.start();
			

		}
		else if(source==stopItem){
			if(rotateT!=null){
				
				mode=NORMAL;
				stopItem.setEnabled(false);
				rotateAllItem.setEnabled(true);
				rotateT.stop();
				rotateT=null;	
			}
		}

		else if(source==exitItem){
			mode=NORMAL;
		}
		
	}




	public void update(Observable o,Object rectangle){
		if(rectangle==null)
			repaint();
		else
			repaint((Rectangle)rectangle);
	
	}
	
	public void paint(Graphics g){
		
		Graphics2D g2d=(Graphics2D)g;
		g2d.scale(scale,scale);
		Iterator elements=app.getModel().getIterator();
		Element element;
		while(elements.hasNext()){
			
			element=(Element)elements.next();
			element.draw(g2d);
		}
	}

	public void drawElement(Element element) {
		Graphics2D g2d=(Graphics2D)getGraphics();	
		element.draw(g2d);
		app.getModel().add(element);
		element=null;
		if(element!=null) {
		g2d.dispose();
		g2d=null;
		}
	}




	public void  setScale(double scale){
		this.scale=scale;;
		scaleState=true;
		repaint();
	}


	public int print(Graphics g,PageFormat pageFormat,int pageIndex) throws PrinterException{
		Graphics2D g2d=(Graphics2D)g;
		if(pageIndex>0)
			return NO_SUCH_PAGE;
		
		Rectangle rect=getModelExtent();
		double scaleX=pageFormat.getImageableWidth()/rect.width;
		double scaleY=pageFormat.getImageableHeight()/rect.height;
		double scale=Math.min(scaleX,scaleY);
		
		g2d.translate((int)(pageFormat.getImageableX()),(int)(pageFormat.getImageableY()));
		g2d.scale(scale,scale);
		g2d.translate(-rect.x,-rect.y);
		paint(g2d);
		return PAGE_EXISTS;
	

	}
		

	private Rectangle getModelExtent(){
		Iterator elements=app.getModel().getIterator();
		Rectangle rect=new Rectangle();
		Element element;
		while(elements.hasNext()){
			element=(Element)elements.next();
			rect.add(element.getBounds());
		}
		if(rect.width==0)
			rect.width=1;
		if(rect.height==0)
			rect.height=1;
		return rect;
	}
		

	class RotateThread  extends Thread{
		
		public void run(){
			double rotateAngle=2*Math.PI/360000;
			Graphics2D g2d=(Graphics2D)getGraphics();
			g2d.setXORMode(getBackground());
			
			Element element;
			while(true){
				
				if(rotateAngle==(2*Math.PI)) rotateAngle=2*Math.PI/360000;
				Iterator elements=app.getModel().getIterator();
				
				while(elements.hasNext()){
					element=(Element)elements.next();
					element.draw(g2d);
					
					element.rotate(rotateAngle);
					element.draw(g2d);
				}
				rotateAngle++;
				try{
						sleep(20);
					}catch(InterruptedException e){}
							}
		}
	}

					
					


	/*class Receiver implements Runnable{
              private byte[] data=new byte[1000];
              private Element element;
              public Receiver(){
                       
                       
              }
              public void run(){
                        while(true){
                                    
                                    try{ 
                                       DatagramPacket dp=new DatagramPacket(data,data.length);
                                       ms.receive(dp);
						if(!(dp.getAddress().equals(local))){
						ByteArrayInputStream byteArrayStream=new ByteArrayInputStream	(data);
						ObjectInputStream in=new ObjectInputStream(byteArrayStream);
						try{
							element=(Element)in.readObject();
						}catch(ClassNotFoundException ee){}
						Graphics2D g2d=(Graphics2D)getGraphics();	
						element.draw(g2d);
						app.getModel().add(element);
						element=null;
						if(element!=null) {
						 	g2d.dispose();
						 	g2d=null;
						}
										
                                       }
                                       
                                       }
                                       catch(IOException e){System.err.println(e);}
                  }
           }   
                                    
    }                          
	private void initmulticast(){
          try{
               ms=new MulticastSocket(port);
               ia=InetAddress.getByName("224.0.1.20");
		local=InetAddress.getLocalHost() ;
          
               ms.joinGroup(ia);
               Receiver rthread=new Receiver();
               Thread t=new Thread(rthread);
		 t.setDaemon(true);
               t.start();
             }catch(IOException e){System.err.println(e);}
	}
	

	  private void send(Element element){
              try{
              ByteArrayOutputStream byteArrayStream =new ByteArrayOutputStream() ;
		ObjectOutputStream os=new ObjectOutputStream(byteArrayStream);
		os.writeObject(element);
		byte[] data=byteArrayStream.toByteArray();
		

                
                     DatagramPacket dp=new DatagramPacket(data,data.length,ia,port);
                     ms.send(dp);
                }catch(IOException ee){System.err.println(ee); }
        }

	*/

}

⌨️ 快捷键说明

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