设计的一个画图程序,想在拖动鼠标的时候可以即时显示矩形的大小,所以在mouseDragged()中使用了repaint()方法,在mouseReleased()中使用了paint()方法,但是这样只能画一个,再画时,之前的就全部清屏了,有什么别的方法可以达到我的目的吗?代码如下import java.awt.*;
import java.awt.event.*;
public class MyCanvas extends Canvas implements MouseMotionListener,MouseListener,ActionListener
{
static int a,b,c,d;
static MyCanvas mc;
static Button bu[]=new Button[4]; public static void main(String args[])
{
mc=new MyCanvas();
mc.addMouseListener(new MyCanvas());
mc.addMouseMotionListener(new MyCanvas()); Frame f=new Frame("Test17"); Panel p1=new Panel(); bu[0]=new Button("铅笔");
bu[1]=new Button("直线");
bu[2]=new Button("矩形");
bu[3]=new Button("圆形");
for(int i=0;i<bu.length;i++)
{
bu[i].setEnabled(true);
bu[i].addActionListener(new MyCanvas());
p1.add(bu[i]);
} f.add(p1,BorderLayout.WEST);
f.add(mc,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public MyCanvas()
{
setSize(800,600);
} public void paint(Graphics g)
{
if(!bu[0].isEnabled())
g.drawLine(c,d,c,d);
else if(!bu[1].isEnabled())
g.drawLine(a,b,c,d);
else if(!bu[2].isEnabled())
g.drawRect(a,b,+(c-a),+(d-b));
}
public void mousePressed(MouseEvent e)
{
a=e.getX();
b=e.getY();
} public void mouseEntered(MouseEvent e){} public void mouseClicked(MouseEvent e){}
public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e)
{
c=e.getX();
d=e.getY();
Graphics g=mc.getGraphics();
mc.paint(g);
}
public void mouseDragged(MouseEvent e)
{
c=e.getX();
d=e.getY();
Graphics g=mc.getGraphics();
mc.repaint();
} public void mouseMoved(MouseEvent e){} public void actionPerformed(ActionEvent e)
{
for(int i=0;i<bu.length;i++)
{
bu[i].setEnabled(true);
} Button but=(Button)e.getSource();
but.setEnabled(false);
}
}
import java.awt.event.*;
public class MyCanvas extends Canvas implements MouseMotionListener,MouseListener,ActionListener
{
static int a,b,c,d;
static MyCanvas mc;
static Button bu[]=new Button[4]; public static void main(String args[])
{
mc=new MyCanvas();
mc.addMouseListener(new MyCanvas());
mc.addMouseMotionListener(new MyCanvas()); Frame f=new Frame("Test17"); Panel p1=new Panel(); bu[0]=new Button("铅笔");
bu[1]=new Button("直线");
bu[2]=new Button("矩形");
bu[3]=new Button("圆形");
for(int i=0;i<bu.length;i++)
{
bu[i].setEnabled(true);
bu[i].addActionListener(new MyCanvas());
p1.add(bu[i]);
} f.add(p1,BorderLayout.WEST);
f.add(mc,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public MyCanvas()
{
setSize(800,600);
} public void paint(Graphics g)
{
if(!bu[0].isEnabled())
g.drawLine(c,d,c,d);
else if(!bu[1].isEnabled())
g.drawLine(a,b,c,d);
else if(!bu[2].isEnabled())
g.drawRect(a,b,+(c-a),+(d-b));
}
public void mousePressed(MouseEvent e)
{
a=e.getX();
b=e.getY();
} public void mouseEntered(MouseEvent e){} public void mouseClicked(MouseEvent e){}
public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e)
{
c=e.getX();
d=e.getY();
Graphics g=mc.getGraphics();
mc.paint(g);
}
public void mouseDragged(MouseEvent e)
{
c=e.getX();
d=e.getY();
Graphics g=mc.getGraphics();
mc.repaint();
} public void mouseMoved(MouseEvent e){} public void actionPerformed(ActionEvent e)
{
for(int i=0;i<bu.length;i++)
{
bu[i].setEnabled(true);
} Button but=(Button)e.getSource();
but.setEnabled(false);
}
}
import java.awt.*;import java.awt.datatransfer.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;import javax.swing.*;
import javax.swing.filechooser.FileFilter;import com.sun.image.codec.jpeg.*;@SuppressWarnings("serial")
class ImagePanel extends JPanel
{
private BufferedImage image; public ImagePanel(BufferedImage image)
{
this.image = image;
prefSize();
} public void setImage(BufferedImage image)
{
this.image = image;
prefSize();
repaint();
} /**
* 设置面板大小
*/
private void prefSize()
{
this.setSize(image.getWidth(), image.getHeight());
} @Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}
}/**
* 文件类型
*/
class ImageFilter extends FileFilter
{ public boolean accept(File f)
{
if (f.isDirectory())
{
return true;
} String extension = getExtension(f);
if (extension != null)
{
if (extension.equals("jpeg") || extension.equals("jpg")
|| extension.equals("bmp"))
{
return true;
} else
{
return false;
}
} return false;
} public String getExtension(File f)
{
String ext = null;
String s = f.getName();
int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1)
{
ext = s.substring(i + 1).toLowerCase();
}
return ext;
} public String getDescription()
{
return "图片类型";
}
}
public class CutScreen extends JFrame
{
private int x, y, w, h;
private BufferedImage bufImage;
private ImagePanel imagePanel;
private Graphics g;
private static Dimension screenDims;
private GraphicsDevice gd = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice();
private JPopupMenu popup = new JPopupMenu();
private JMenuItem[] popupm =
{ new JMenuItem("Copy"), new JMenuItem("Save"), new JMenuItem("Reset"),
new JMenuItem("Exit") };
private JFileChooser fileChooser = new JFileChooser(); public CutScreen()
{ this.setLayout(new BorderLayout());
this.add(buildControls()); // 设置标题
this.setTitle("截图程序");
// 去掉窗口的装饰
this.setUndecorated(true);
// 采用指定的窗口装饰风格
this.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
// 设置全屏
gd.setFullScreenWindow(this);
// 窗体始终靠前
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private JComponent buildControls()
{
// 获取屏幕图像
bufImage = getScreenImage();
imagePanel = new ImagePanel(bufImage); // 注册事件监听
imagePanel.addMouseListener(new MouseAdapter()
{ // 当鼠标按下时
public void mousePressed(MouseEvent e)
{
// 获取按下时的鼠标坐标
x = e.getX();
y = e.getY();
} public void mouseReleased(MouseEvent e)
{
if (SwingUtilities.isLeftMouseButton(e))
{
// 设置截取图像的宽和高
w = Math.abs(x - e.getX());
h = Math.abs(y - e.getY());
if (w > 0 && h > 0)
{
g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
g.dispose();
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
} public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
});
imagePanel.addMouseMotionListener(new MouseMotionListener()
{ // 当鼠标拖动时
public void mouseDragged(MouseEvent e)
{
if (SwingUtilities.isLeftMouseButton(e))
{
g = imagePanel.getGraphics();
g.setColor(Color.blue);
imagePanel.setImage(bufImage); g.drawLine(x, y, e.getX(), y);
g.drawLine(x, y, x, e.getY());
g.drawLine(x, e.getY(), e.getX(), e.getY());
g.drawLine(e.getX(), y, e.getX(), e.getY());
}
} public void mouseMoved(MouseEvent e)
{
} }); popupm[0].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{ // 复制到剪贴板
setClipboardImage(getAreaImage());
System.exit(0);
}
});
popupm[1].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
save();
System.exit(0);
}
});
popupm[2].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
imagePanel.setImage(bufImage);
}
});
popupm[3].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}); this.addKeyListener(new KeyListener()
{
// 按Esc键退出
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
{
System.exit(0);
}
} public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
}); for (int i = 0; i < popupm.length; i++)
{
popup.add(popupm[i]);
} fileChooser.addChoosableFileFilter(new ImageFilter());
fileChooser.removeChoosableFileFilter(fileChooser
.getAcceptAllFileFilter()); return imagePanel;
} /**
* 获取屏幕图像
*
* @return:返回BufferedImage对象
*/
private BufferedImage getScreenImage()
{
Robot robot;
try
{
robot = new Robot();
} catch (Exception e)
{
throw new RuntimeException("unable to construct Robot");
}
// 获取屏幕尺寸
screenDims = Toolkit.getDefaultToolkit().getScreenSize(); BufferedImage screen = robot.createScreenCapture(new Rectangle(0, 0,
screenDims.width, screenDims.height)); return screen;
} /**
* 获取截图区域
*
* @return:返回BufferedImage对象
*/
private BufferedImage getAreaImage()
{
return bufImage.getSubimage(x, y, w, h);
} private void save()
{
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION)
{
save(fileChooser.getSelectedFile());
}
} /**
* 保存文件
*
* @param file:文件路径
*/
private void save(File file)
{
BufferedOutputStream imageOut;
try
{
imageOut = new BufferedOutputStream(new FileOutputStream(file));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(imageOut);
encoder.encode(getAreaImage());
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (ImageFormatException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
} /**
* 复制到剪贴板
*
* @param image:BufferedImage对象
*/
private void setClipboardImage(final BufferedImage image)
{
Transferable trans = new Transferable()
{
public DataFlavor[] getTransferDataFlavors()
{
return new DataFlavor[]
{ DataFlavor.imageFlavor };
} public boolean isDataFlavorSupported(DataFlavor flavor)
{
return DataFlavor.imageFlavor.equals(flavor);
} public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
} };
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
null);
}
public static void main(String[] args)
{ SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new CutScreen();
}
});
}
}研究研究这个