📄 drawfigurepanel.java
字号:
package drawfigure;import java.awt.Graphics;import java.awt.Point;import java.awt.event.MouseEvent;import java.awt.event.*;import javax.swing.JPanel;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author 孙明辉 * @version 1.0 */public class DrawFigurePanel extends JPanel { //atribuits public static final int SELECT=0; public static final int LINE=1; public static final int RECTANGLE=2; public static final int OVAL=3; /** * 当前工具类型,它可能和当前的图形(currFigure)不一致,比如:用SELECT工具选中一个RectangleFigure * 那么,当前工具类型=SELECT,而当前图形=RectangleFigure */ private int currToolType=-1; private Figure currFigure=null; private Figures figures=new Figures(); private Point dragStartPoint, dragEndPoint; //拖放图形时的起始坐标和终止坐标 public void setCurrentToolType(int type){ currToolType=type; } public int getCurrentToolType(){ return currToolType; } public void setCurrentFigure(Figure figure){ currFigure=figure; } public Figure getCurrentFigure(){ return currFigure; } public Figures getFigures(){ return figures; } public void setFigures(Figures f){ figures=f; } //public Document document; //methods public DrawFigurePanel() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { this_mouseDragged(e); } public void mouseMoved(MouseEvent e){ this_mouseMoved(e); } }); this.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(MouseEvent e) { this_mouseClicked(e); } public void mousePressed(MouseEvent e) { this_mousePressed(e); } public void mouseReleased(MouseEvent e) { this_mouseReleased(e); } }); ////通常按键的时候焦点在其他控件上,而不是在本Panel上,所以此代码基本没有用 //this_keyPressed(e)方法被frame的key事件调用才能生效 this.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ this_keyPressed(e); } }); //// }//end jbIni() //鼠标单击 void this_mouseClicked(MouseEvent e) { // } //拖动鼠标的时候 void this_mouseDragged(MouseEvent e) { if(currFigure==null){return;} Graphics g=this.getGraphics(); g.setXORMode(this.getBackground()); //System.out.println(currFigure+"\nismoving="+currFigure.isMoving()+"@mouseDrag"); //如果是选择工具 if(currToolType==SELECT){ dragEndPoint=e.getPoint(); if(currFigure.isMoving()){//如果当前图形可以移动,说明在移动图形 currFigure.move(g,dragEndPoint.x-dragStartPoint.x,dragEndPoint.y-dragStartPoint.y); }else if(currFigure.isResizing()){//如果当前图形可以变形,说明在变形 currFigure.resize(g,dragEndPoint.x-dragStartPoint.x,dragEndPoint.y-dragStartPoint.y); } dragStartPoint=dragEndPoint; return; }else{ //如果是画图 if(currFigure.isFirstDraw()){ currFigure.draw(g); currFigure.setFirstDraw(false); if(!(currFigure instanceof SelectFigure)){figures.add(currFigure);}//在此处加进去是否合适? }else{ currFigure.draw(g); currFigure.setEndPoint(e.getPoint()); currFigure.draw(g); } } //g.setPaintMode(); }//鼠标移动的时候 void this_mouseMoved(MouseEvent e){ this.setCursor(figures.getCursor(e.getPoint())); }//按下鼠标的时候 void this_mousePressed(MouseEvent e) { //如此多的重复代码,有待改进=== switch(currToolType){ case LINE: currFigure=new LineFigure(e.getPoint()); currFigure.setDrawing(true); //currFigure.setStartEndPoint(e.getPoint(),e.getPoint());//鼠标按下时起点=终点 currFigure.setFirstDraw(true); break; case RECTANGLE: currFigure=new RectangleFigure(e.getPoint()); currFigure.setDrawing(true); //currFigure.setStartEndPoint(e.getPoint(),e.getPoint());//鼠标按下时起点=终点 currFigure.setFirstDraw(true); break; case OVAL:currFigure=new OvalFigure(); currFigure.setDrawing(true); currFigure.setStartEndPoint(e.getPoint(),e.getPoint());//鼠标按下时起点=终点 currFigure.setFirstDraw(true); break; case SELECT: Figure tmpFigure=figures.getFigureFromPoint(e.getPoint()); //如果没有选中了图形,把上次选中的图形设置为未选中 if(tmpFigure==null){ System.out.println("select none!:("); if((currFigure!=null)&&(currFigure.isSelected())){ currFigure.unSelected(); repaint(); } }else{ //如果选中一个图形,但是不是当前图形(上次选中的,或者上次画的),则把这次选中的设置为当前图形 if(!tmpFigure.equals(currFigure)){ currFigure.unSelected(); currFigure=tmpFigure; } currFigure.selected(); repaint(); //如果鼠标在控制块内,则要改变图形,否则是移动图形 ControlRect ctrl; if((ctrl=currFigure.getControlRect(e.getPoint()))!=null){ currFigure.setResizing(true,ctrl.getPosition()); }else{ currFigure.setMoving(true); } dragStartPoint=e.getPoint(); }//end if //end SELECT case }//end switch }//释放鼠标的时候 void this_mouseReleased(MouseEvent e) { if(currFigure!=null){ currFigure.setFirstDraw(false); currFigure.setDrawing(false); currFigure.setMoving(false); currFigure.setResizing(false); } } protected void paintComponent(Graphics g) { /**@todo Override this javax.swing.JComponent method*/ super.paintComponent(g); g.setXORMode(this.getBackground()); if(figures!=null) for(int i=0;i<figures.size();i++){ Object x=figures.get(i); if(x instanceof LineFigure){ LineFigure lineFigure=(LineFigure)x; lineFigure.draw(g); } if(x instanceof RectangleFigure){ RectangleFigure recFigure=(RectangleFigure)x; recFigure.draw(g); } if(x instanceof OvalFigure){ OvalFigure ovalFigure=(OvalFigure)x; ovalFigure.draw(g); } } //System.out.println("figures number="+figures.size()); //figures.printAllFigures(); } public void this_keyPressed(KeyEvent e){ if(e.getKeyCode()==KeyEvent.VK_DELETE){ if((currFigure!=null)&&(currFigure.isSelected())){ figures.remove(currFigure); repaint(); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -