java AWT 使用系统剪贴板传递图像

来源:互联网 发布:淘宝买了汽枪配件警察 编辑:程序博客网 时间:2024/05/21 11:37

Transferable接口代表可以放入剪贴板的传输对象,如果需要将图像入放剪贴板内,则必须提供一个Transferable接口的实现类。封装一个image对象,并且向外表现为imageFlavor内容:

ImageSelection.java

package javaAWT;import java.awt.Image;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.io.IOException;public class ImageSelection implements Transferable{    private Image image;    // 构造器,负责持有一个Image对象;    public ImageSelection(Image image) {        this.image = image;    }    // 返回该 Transferable对象所支持的所有DataFlavor    @Override    public DataFlavor[] getTransferDataFlavors() {        // TODO Auto-generated method stub        return new DataFlavor[] { DataFlavor.imageFlavor};    }    // 返回该Transferable对象是否支持指定的DataFlavor    @Override    public boolean isDataFlavorSupported(DataFlavor flavor) {        // TODO Auto-generated method stub        return flavor.equals(DataFlavor.imageFlavor);    }    @Override    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {        // TODO Auto-generated method stub        if (flavor.equals(DataFlavor.imageFlavor)) {            return image;        } else {            throw new UnsupportedFlavorException(flavor);        }    }}

CopyImage.java

package javaAWT;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Canvas;import java.awt.Color;import java.awt.Dimension;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.MenuItem;import java.awt.Panel;import java.awt.PopupMenu;import java.awt.Toolkit;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.DataFlavor;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import java.awt.image.BufferedImage;import java.util.ArrayList;import java.util.List;public class CopyImage {    // 系统剪贴板    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();    // 画图区的宽度,高度    private int AREA_WIDTH = 500;    private int AREA_HEIGHT = 400;    // 保存上一次鼠标征拖动事件的坐标    private int preX = -1;    private int preY = 1;    // 定义一个右键菜单用于设置 画笔颜色    PopupMenu popupMenu = new PopupMenu();    MenuItem redItem = new MenuItem("Red");    MenuItem greenItem = new MenuItem("Green");    MenuItem blueItem = new MenuItem("Blue");    BufferedImage bufferedImage = new BufferedImage(AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB);    // 使用ArrayList来保存所有粘贴进来的Image---就是当成图层处理    List<Image> imageList = new ArrayList<>();    // 获取bufferedImage对象的Graphics    Graphics graphics = bufferedImage.getGraphics();    private Frame frame = new Frame("CopyImage");    private DrawCanvas drawCanvas = new DrawCanvas();    // 用于保存画笔颜色    private Color foreColor = new Color(255, 0, 0);    private Button copy = new Button("Copy");    private Button paste = new Button("Paste");    public void init() {        // 定义右键菜单的事件监听器        ActionListener menuListener = new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                switch (e.getActionCommand().toString()) {                case "Red":                    foreColor = new Color(255,0,0);                    break;                case "Green":                    foreColor = new Color(0,255,0);                    break;                case "Blue":                    foreColor = new Color(0,0,255);                    break;                    default:                        break;                }            }        };        // 为三个菜单添加事件监听        redItem.addActionListener(menuListener);        greenItem.addActionListener(menuListener);        blueItem.addActionListener(menuListener);        //将菜单项组合成右键菜单        popupMenu.add(redItem);        popupMenu.add(greenItem);        popupMenu.add(blueItem);        // 将右键菜单添加到drawCanvas 对象中        drawCanvas.add(popupMenu);        // bufferedImage 对象的背景色填充为白色        graphics.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);        drawCanvas.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));        //监听鼠标移动动作        drawCanvas.addMouseMotionListener(new MouseMotionListener() {            @Override            public void mouseMoved(MouseEvent e) {                // TODO Auto-generated method stub            }            // 实现按下鼠标键并拖动的事件处理器            @Override            public void mouseDragged(MouseEvent e) {                // TODO Auto-generated method stub                // 如果preX,preY 大于0                if (preX > 0 && preY > 0) {                    // 设置当前颜色                    graphics.setColor(foreColor);                    graphics.drawLine(preX, preY, e.getX(), e.getY());                }                // 将当前鼠标事件坐标保存到preX,preY                preX = e.getX();                preY = e.getY();                // 重绘                drawCanvas.repaint();            }        });        // 监听鼠标事件        drawCanvas.addMouseListener(new MouseAdapter() {            // 实现鼠标松开的事件处理            @Override            public void mouseReleased(MouseEvent e) {                // TODO Auto-generated method stub                super.mouseReleased(e);                if (e.isPopupTrigger()) {                    popupMenu.show(drawCanvas, e.getX(), e.getY());                }                // 复位坐标                preX = -1;                preY = -1;            }            @Override            public void mousePressed(MouseEvent e) {                // TODO Auto-generated method stub                super.mousePressed(e);            }            @Override            public void mouseClicked(MouseEvent e) {                // TODO Auto-generated method stub                super.mouseClicked(e);            }            @Override            public void mouseDragged(MouseEvent e) {                // TODO Auto-generated method stub                super.mouseDragged(e);            }        });        frame.addWindowListener(new WindowAdapter() {            @Override            public void windowClosing(WindowEvent e) {                // TODO Auto-generated method stub                super.windowClosing(e);                System.exit(0);            }        });        frame.add(drawCanvas);        Panel panel = new Panel();        copy.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                // 将bufferedImage对象封装成ImageSelection对象                ImageSelection contents = new ImageSelection(bufferedImage);                // 将ImageSelection对象放入剪贴板中                clipboard.setContents(contents, null);            }        });        paste.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // TODO Auto-generated method stub                // 如果剪贴板中包含imageFlavor内容                if (clipboard.isDataFlavorAvailable(DataFlavor.imageFlavor)) {                    try {                        // 取出剪贴板中的iamgeFlavor内容,并添加到List                        imageList.add((Image)clipboard.getData(DataFlavor.imageFlavor));                        drawCanvas.repaint();                    } catch (Exception E) {                        E.printStackTrace();                    }                }            }        });        panel.add(copy);        panel.add(paste);        frame.add(panel, BorderLayout.SOUTH);        frame.pack();        frame.setVisible(true);    }    class DrawCanvas extends Canvas {        @Override        public void paint(Graphics g) {            // TODO Auto-generated method stub            super.paint(g);            // 将bufferedImage绘制到该组件上            g.drawImage(bufferedImage, 0, 0, null);            // 将List里所有的Image对像都绘制出来            for (Image img: imageList) {                g.drawImage(img, 0, 0, null);            }        }    }    public static void main(String[] args) {        new CopyImage().init();    }}

运行效果:

点击copy按键 然后在画图程序中点粘贴可以将图像内容粘贴进来
这里写图片描述

原创粉丝点击