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按键 然后在画图程序中点粘贴可以将图像内容粘贴进来
阅读全文
0 0
- java AWT 使用系统剪贴板传递图像
- java AWT 剪贴板Clipboard
- [疯狂Java]AWT剪切板:图像传递
- Java如何使用系统剪贴板
- java中系统剪贴板的使用
- Vim使用系统剪贴板
- Java -- AWT 画图,图像处理
- Java访问系统剪贴板
- Java监视系统剪贴板
- JAVA.AWT.CANVAS使用
- java.awt.headlesss使用
- [疯狂Java]AWT剪切板:本地(系统)剪切板传递Java对象
- java图像用户界面swing、awt、swt
- 使用 java.awt.Graphics2D 画线
- java.awt.Image 的使用
- ubuntu 10.04vim7.3使用系统剪贴板
- Unity使用Android系统剪贴板复制&粘贴
- Java之系统剪贴板WindowUtils包-yellowcong
- 单点登录
- 机器学习方法篇(14)------SVM公式推导
- 周中训练笔记11——线段树总结
- 51nod 1182 完美字符串(贪心)
- 苹果创始人———乔布斯
- java AWT 使用系统剪贴板传递图像
- 云服务器的优势(阿里云)
- 系统自带ImageLoader的简单使用
- XL
- 《阿里巴巴 Java 开发规约》自动化检测插件全球首发!
- 3-伪目标的引入
- 浏览器原理(三)——渲染过程之解析
- LWC 54:697. Degree of an Array
- 详解python装饰器