响应鼠标按下事件,记录起始点到全局变量响应鼠标拖动事件,启用XOR模式,绘制前一个矩形(抹除前一个矩形),新建一个矩形并绘制(当前矩形);新建矩形的算法有多种,以下采用的算法适应各个方向上的拖动;注意使用XOR模式来抹除之前绘制的矩形,千万不要使用repaint方法。响应鼠标释放时间,启用XOP模式抹除最后一次矩形 //起始点,鼠标按下时记录 Point pBegin; //绘图矩形 Rectangle rect; private JPanel getJPanelWaveBox() { if (jPanelWaveBox == null) { jPanelWaveBox = new JPanel(); jPanelWaveBox.setBounds(197, 12, 543, 344); jPanelWaveBox.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent evt) { Graphics2D g2 = (Graphics2D) jPanelWaveBox.getGraphics(); //启用XOR模式 g2.setXORMode(Color.white); //绘制之前的矩形 if (rect != null) { g2.draw(rect); } //绘制现在的矩形 rect = new Rectangle((int) Math.min(pBegin.getX(), evt.getPoint().getX()), (int) Math.min(pBegin.getY(), evt.getPoint().getY()), (int) Math.abs(pBegin.getX() - evt.getPoint().getX()),(int) Math.abs(pBegin.getY() - evt.getPoint().getY())); g2.draw(rect); g2.setPaintMode(); g2.dispose(); } }); jPanelWaveBox.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evt) { try { // 画选择框(实际效果为去掉) Graphics2D g2 = (Graphics2D) jPanelWaveBox.getGraphics(); g2.setXORMode(Color.white); g2.draw(rect); g2.setPaintMode(); g2.dispose(); } catch (Exception e) {} pBegin = null; rect = null; } public void mousePressed(MouseEvent evt) { pBegin = evt.getPoint(); jPanelWaveBox.requestFocus(); } }); } return jPanelWaveBox; }