请问Java 的剪切板怎么使用的

Python019

请问Java 的剪切板怎么使用的,第1张

11月16日

java 中的剪切板

通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,本地剪切板使用 Clipborad cp = new Clipboard("clip1")来构造;系统剪切板通过

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard()

获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据

1. 从指定的剪切板中获取文本内容

protected static String getClipboardText(Clipboard clip) throws Exception{

// 获取剪切板中的内容

Transferable clipT = clip.getContents(null)

if (clipT != null) {

// 检查内容是否是文本类型

if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))

return (String)clipT.getTransferData(DataFlavor.stringFlavor)

}

return null

}

2. 往剪切板写文本数据

protected static void setClipboardText(Clipboard clip, String writeMe) {

Transferable tText = new StringSelection(writeMe)

clip.setContents(tText, null)

}

3. 从剪切板读取图像

public static Image getImageFromClipboard() throws Exception{

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard()

Transferable cc = sysc.getContents(null)

if (cc == null)

return null

else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))

return (Image)cc.getTransferData(DataFlavor.imageFlavor)

return null

}

4. 写图像到剪切板

protected static void setClipboardImage2(final Image 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)

}

有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。

/*

* Created on 2004-12-23

* 查看图形的窗口

*/

package javayou.clipboard

import java.awt.Frame

import java.awt.Graphics

import java.awt.Image

import java.awt.MediaTracker

import java.awt.event.WindowAdapter

import java.awt.event.WindowEvent

/**

* @author Winter Lau 用于显示图形的窗口

*/

public class ImageViewer extends Frame {

private Image image

/**

* 显示一个图像

* @param viewMe

*/

public ImageViewer(Image viewMe) {

image = viewMe

MediaTracker mediaTracker = new MediaTracker(this)

mediaTracker.addImage(image, 0)

try {

mediaTracker.waitForID(0)

} catch (InterruptedException ie) {

ie.printStackTrace()

System.exit(1)

}

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0)

}

})

//窗口适应图像大小

setSize(image.getWidth(null), image.getHeight(null))

//窗口标题

setTitle("Viewing Image from Clipboard")

setVisible(true)

}

public void paint(Graphics graphics) {

graphics.drawImage(image, 0, 0, null)

}

/**

* 用于读取图像文件并生成Image对象

*/

public static Image getImageFromFile(String fileName) {

Toolkit toolkit = Toolkit.getDefaultToolkit()

Image image = toolkit.getImage(fileName)

return image

}

}

首先要明白 “剪切板” 里面能放什么内容。 剪切板只能放 “文本内容”或者“文件路径”, 如果你选中文字,然后复制,那么放在剪切板就是文字内容;如果你选择一个文件,复制,那放在剪切板里面是 文件的路径。

你说的 文件复制到剪切板 是不合理的。

Java 通过 java.awt.datatransfer.Clipboard 访问剪切板。

package test

import java.awt.Color

import java.awt.Graphics2D

import java.awt.Image

import java.awt.geom.AffineTransform

import java.awt.image.AffineTransformOp

import java.awt.image.BufferedImage

import java.io.File

import java.io.IOException

import java.nio.Buffer

import javax.imageio.ImageIO

import javax.imageio.stream.ImageOutputStream

/**

 * 裁剪、缩放图片工具类

 * 

 * @author CSDN 没有梦想-何必远方

 */

public class ImgUtils {

/**

 * 缩放图片方法

 * 

 * @param srcImageFile

 *            要缩放的图片路径

 * @param result

 *            缩放后的图片路径

 * @param height

 *            目标高度像素

 * @param width

 *            目标宽度像素

 * @param bb

 *            是否补白

 */

public final static void scale(String srcImageFile, String result,

int height, int width, boolean bb) {

try {

double ratio = 0.0 // 缩放比例

File f = new File(srcImageFile)

BufferedImage bi = ImageIO.read(f)

Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH)// bi.SCALE_SMOOTH

// 选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。

// 计算比例

if ((bi.getHeight() > height) || (bi.getWidth() > width)) {

double ratioHeight = (new Integer(height)).doubleValue()

/ bi.getHeight()

double ratioWhidth = (new Integer(width)).doubleValue()

/ bi.getWidth()

if (ratioHeight > ratioWhidth) {

ratio = ratioHeight

} else {

ratio = ratioWhidth

}

AffineTransformOp op = new AffineTransformOp(AffineTransform// 仿射转换

.getScaleInstance(ratio, ratio), null)// 返回表示剪切变换的变换

itemp = op.filter(bi, null)// 转换源 BufferedImage 并将结果存储在目标

// BufferedImage 中。

}

if (bb) {// 补白

BufferedImage image = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB)// 构造一个类型为预定义图像类型之一的

// BufferedImage。

Graphics2D g = image.createGraphics()// 创建一个

// Graphics2D,可以将它绘制到此

// BufferedImage 中。

g.setColor(Color.white)// 控制颜色

g.fillRect(0, 0, width, height)// 使用 Graphics2D 上下文的设置,填充 Shape

// 的内部区域。

if (width == itemp.getWidth(null))

g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,

itemp.getWidth(null), itemp.getHeight(null),

Color.white, null)

else

g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,

itemp.getWidth(null), itemp.getHeight(null),

Color.white, null)

g.dispose()

itemp = image

}

ImageIO.write((BufferedImage) itemp, "JPEG", new File(result)) // 输出压缩图片

} catch (IOException e) {

e.printStackTrace()

}

}

/**

 * 裁剪图片方法

 * 

 * @param bufferedImage

 *            图像源

 * @param startX

 *            裁剪开始x坐标

 * @param startY

 *            裁剪开始y坐标

 * @param endX

 *            裁剪结束x坐标

 * @param endY

 *            裁剪结束y坐标

 * @return

 */

public static BufferedImage cropImage(BufferedImage bufferedImage,

int startX, int startY, int endX, int endY) {

int width = bufferedImage.getWidth()

int height = bufferedImage.getHeight()

if (startX == -1) {

startX = 0

}

if (startY == -1) {

startY = 0

}

if (endX == -1) {

endX = width - 1

}

if (endY == -1) {

endY = height - 1

}

BufferedImage result = new BufferedImage(endX - startX, endY - startY,

4)

for (int x = startX x < endX ++x) {

for (int y = startY y < endY ++y) {

int rgb = bufferedImage.getRGB(x, y)

result.setRGB(x - startX, y - startY, rgb)

}

}

return result

}

public static void main(String[] args) throws IOException {

File input = new File("input.jpg")

BufferedImage img = ImageIO.read(input)

cropImage(img, 10, 10, 20, 20)

File output = new File("output.jpg")

ImageIO.write(img, "jpg", output)

}

}