📄 sketchview.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 + -