?? 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 + -