java swing 把控件映射为BufferedImage
如何把java swing的可视控件 转化为BufferedImage 呢?
直接上代码:
/*** * convert JTextArea to image * @param ta * @param destFile * @param format */ public static BufferedImage genericImage(JComponent ta,File destFile,String format){//TODO 如何提高分辨率 BufferedImage img = new BufferedImage(ta.getWidth(), ta.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d = img.createGraphics(); ta.printAll(g2d); g2d.dispose(); if(!ValueWidget.isNullOrEmpty(destFile)){ try { ImageIO.write(img, format/*"jpg"*/, destFile); } catch (IOException ex) { ex.printStackTrace(); } } return img; }
如何把BufferedImage 复制到剪切板:
/*** * 复制图片到剪切板 * @param image */ public static void setClipboardImage(Container frame, final Image image) { Transferable trans = new Transferable() { @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return image; } throw new UnsupportedFlavorException(flavor); } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { DataFlavor.imageFlavor }; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return DataFlavor.imageFlavor.equals(flavor); } }; frame.getToolkit().getSystemClipboard().setContents(trans, null); }
调用:
BufferedImage img =ImageHWUtil.genericImage(ta, null, "jpg"/*picFormat*/); if(ValueWidget.isNullOrEmpty(img)){ return; } ComponentUtil.setClipboardImage(ta.getParent(),img); ToastMessage toastMessage = new ToastMessage("复制图片到剪切板",3000); toastMessage.setVisible(true);
下面是详细工具类:
package com.swing.component; import java.awt.Color; import java.awt.Container; import java.awt.Frame; import java.awt.Image; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JProgressBar; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import com.common.dict.Constant2; import com.common.util.SystemHWUtil; import com.common.util.TypeUtil; import com.common.util.WindowUtil; import com.io.hw.file.util.FileUtils; import com.string.widget.util.ValueWidget; import com.swing.menu.MenuUtil2; import com.swing.messagebox.GUIUtil23; import com.time.util.TimeHWUtil; public final class ComponentUtil { /*** * 为了防止JTextField 重复增加 DocumentListener */ public static List<JTextField> tfs = new ArrayList<JTextField>(); /*** * 获取指定页面 复选框被选中的个数 * * @param checkBoxes * @param startIndex * :currentPage * size_per_page * @param count * @return */ public static int getSelSum(List checkBoxes, int startIndex, int count) { if (checkBoxes == null || checkBoxes.size() == 0) { return 0; } else { JCheckBox[] chkArr = getCurrentPageChkbox(checkBoxes, startIndex, count); if (chkArr == null) { return 0; } int tmp = 0; for (int i = 0; i < chkArr.length; i++) { JCheckBox array_element = chkArr[i]; tmp += TypeUtil.bool2int(array_element.isSelected()); } return tmp; } } /*** * * @param checkBoxes * @param startIndex * :0,5,10,15 ;if =-1,indicate no paging * @param count * :size of per page */ public static void setSelect(List checkBoxes, int startIndex, int count) { JCheckBox[] chkArr = getCurrentPageChkbox(checkBoxes, startIndex, count); if (ValueWidget.isNullOrEmpty(chkArr)) { return; } for (int i = 0; i < chkArr.length; i++) { JCheckBox chk = chkArr[i]; chk.setSelected(true); // System.out.println(2); } } /*** * * @param checkBoxes * @param startIndex * :0,5,10,15 ;if =-1,indicate no paging and omit count * @param count * :omit when startIndex=-1 * @return */ public static JCheckBox[] getCurrentPageChkbox(List checkBoxes, int startIndex, int count) { if (checkBoxes == null || checkBoxes.size() == 0) { return null; } else { int endIndex = startIndex + count; int sum_chk = checkBoxes.size(); if (/*startIndex == -1*/startIndex <0) { startIndex = 0; } else { if (sum_chk < endIndex) { endIndex = sum_chk; } } JCheckBox[] chkArr = new JCheckBox[endIndex - startIndex]; int index3 = 0; for (int i = startIndex; i < endIndex&i<sum_chk; i++) { JCheckBox chk = (JCheckBox) checkBoxes.get(i); chkArr[index3] = chk; index3++; } return chkArr; } } public static int getCurrentPageChkboxSum(List checkBoxes, int startIndex, int count) { if (checkBoxes == null || checkBoxes.size() == 0) { return 0; } else { JCheckBox[] chkArr = getCurrentPageChkbox(checkBoxes, startIndex, count); return chkArr.length; } } /*** * 当文本框中输入\ 时,自动扫描该目录下是否只有一个文件,若只有一个文件,设置文本框的值为该文件的绝对路径 * * @param sourceTF * @param e * @throws BadLocationException */ public static void assistantTF(final JTextField sourceTF, DocumentEvent e) throws BadLocationException { int changeLength = e.getLength(); if (changeLength == 1) {// 表示一次性增加的字符个数是1 final Document doc = e.getDocument(); final String input = doc.getText(e.getDocument().getLength() - 1, changeLength); String filepath = null; File[] files = null; final String sourceFileStr = sourceTF.getText(); if (input.endsWith(SystemHWUtil.SEPARATOR)) {// 输入的必须是一个字符,必须是\ files = FileUtils.getFilesByPathAndSuffix(sourceFileStr, ""); } else { String fatherFolder = SystemHWUtil.getParentDir(sourceFileStr); if (!ValueWidget.isNullOrEmpty(fatherFolder)) { files = FileUtils.getFilesByPathAndPrefix(fatherFolder, SystemHWUtil.getFileSimpleName(sourceFileStr)); } } if (!ValueWidget.isNullOrEmpty(files)) { if (files.length == 1) { filepath = files[0].getAbsolutePath(); // System.out.println(filepath); } } if (!ValueWidget.isNullOrEmpty(filepath)) { // System.out.println("input:" + filepath); // 临时变量 final String filepath_tmp = filepath; new Thread(new Runnable() { @Override public void run() { // int length2=sourceFileStr.length(); // try { // doc.insertString(length2-1, "abc", null); // } catch (BadLocationException e4) { // e4.printStackTrace(); // } sourceTF.setText(filepath_tmp);// 应该放在线程中,不然会报异常:java.lang.IllegalStateException: // Attempt to mutate in // notification,参考:http://stackoverflow.com/questions/2788779/java-lang-illegalstateexception-while-using-document-listener-in-textarea-java sourceTF.setCaretPosition(filepath_tmp.length()); // sourceTF.updateUI(); } }).start(); } } } public static void assistantTF(final JTextField sourceTF) { boolean isContains = tfs.contains(sourceTF); if (isContains) { throw new RuntimeException( "This JTextField has added the DocumentListener."); } final Document doc = sourceTF.getDocument(); DocumentListener docLis = new DocumentListener() { @Override public void removeUpdate(DocumentEvent e) { } @Override public void insertUpdate(DocumentEvent e) { // System.out.println("insert"); try { ComponentUtil.assistantTF(sourceTF, e);// Assist path // complement } catch (BadLocationException e2) { e2.printStackTrace(); } } @Override public void changedUpdate(DocumentEvent e) { // System.out.println("change"); } }; doc.addDocumentListener(docLis); tfs.add(sourceTF); } /*** * Get a copy button. * * @param tp * @return */ public static JButton getCopyBtn(final JTextPane tp) { JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_COPY); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(!ValueWidget.isNullOrEmpty(tp)){ String input = tp.getText(); if (!ValueWidget.isNullOrEmpty(input)) { WindowUtil.setSysClipboardText(input); } }} }); return copyBtn; } /*** * Get a copy button. * * @param tf * @return *//* public static JButton getCopyBtn(final JTextField tf) { JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_COPY); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(!ValueWidget.isNullOrEmpty(tf)){ String input = tf.getText(); if (!ValueWidget.isNullOrEmpty(input)) { WindowUtil.setSysClipboardText(input); } }} }); return copyBtn; }*/ /*** * Get a copy button. * * @param tf * @return */ public static JButton getCopyBtn(final JTextComponent ta) { JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_COPY); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(!ValueWidget.isNullOrEmpty(ta)){ String input = ta.getText(); if (!ValueWidget.isNullOrEmpty(input)) { WindowUtil.setSysClipboardText(input); } } } }); return copyBtn; } /*** * Get a paste button. * * @param ta * @return */ public static JButton getPasteBtn(final JTextComponent ta) { JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_PASTE); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String input = WindowUtil.getSysClipboardText(); if (!ValueWidget.isNullOrEmpty(input)) { ta.setText(input); } } }); return copyBtn; } /*** * Get a paste button. * * @param tf * @return */ /*public static JButton getPasteBtn(final JTextField tf) { JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_PASTE); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String input = WindowUtil.getSysClipboardText(); if (!ValueWidget.isNullOrEmpty(input)) { tf.setText(input); } } }); return copyBtn; }*/ /*** * Get a paste button. * * @param tp * @return */ public static JButton getPasteBtn(final JTextPane tp) { if(ValueWidget.isNullOrEmpty(tp)){ return null; } JButton copyBtn = new JButton(MenuUtil2.ACTION_STR_PASTE); copyBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String input = WindowUtil.getSysClipboardText(); if (!ValueWidget.isNullOrEmpty(input)) { tp.setText(input); } } }); return copyBtn; } /*** * 默认显示时间 * @param resultTextArea * @param result * @param isAddDivide */ public static void appendResult(JTextArea resultTextArea, String result, boolean isAddDivide){ appendResult(resultTextArea, result, isAddDivide, true); } /*** * * @param resultTextArea * @param result * @param isAddDivide * @param prependTime : 是否显示时间 */ public static void appendResult(JTextArea resultTextArea, String result, boolean isAddDivide,boolean prependTime) { if(ValueWidget.isNullOrEmpty(resultTextArea)){ return; } appendResult(resultTextArea, result, isAddDivide, false,prependTime); } /*** * 向结果文本框追加内容,不会删除原来的内容。 * * @param result * @param CRLFbefore : 表示是否在前面添加一个回车换行 * @param isAddDivide * @param prependTime : 是否显示时间 */ public static void appendResult(JTextArea resultTextArea, String result, boolean isAddDivide,boolean CRLFbefore,boolean prependTime) { if(ValueWidget.isNullOrEmpty(resultTextArea)){ return; } if (result == null) { result = ""; } else { result = result + SystemHWUtil.CRLF; if(prependTime){ String currentTime=TimeHWUtil.getCurrentMiniuteSecondZH(); result = currentTime+"\t| "+result; } } if(CRLFbefore){ result=SystemHWUtil.CRLF+result; } Document doc = resultTextArea.getDocument(); int length = doc.getLength(); try { doc.insertString(length, result, null); length = length + result.length(); if (isAddDivide) { doc.insertString(length, SystemHWUtil.DIVIDING_LINE + SystemHWUtil.CRLF, null); } } catch (BadLocationException e) { e.printStackTrace(); GUIUtil23.warningDialog(e.getMessage()); } } /*** * 向结果文本框追加内容,不会删除原来的内容。 * * @param result * @param isAddDivide */ public static void appendResult(JTextPane resultTextArea, String result, boolean isAddDivide) { if(ValueWidget.isNullOrEmpty(resultTextArea)){ return; } appendResult(resultTextArea, result, null, isAddDivide); } /*** * 向结果文本框追加内容,不会删除原来的内容。 * * @param result * @param isAddDivide */ public static void appendResult(JTextPane resultTextPane, String result, AttributeSet set, boolean isAddDivide) { if(ValueWidget.isNullOrEmpty(resultTextPane)){ return; } if (result == null) { result = ""; } else { result = result + SystemHWUtil.CRLF; } Document doc = resultTextPane.getDocument();resultTextPane.getText(); int length = doc.getLength(); // if(length>7){ // length=length-17; // } try { doc.insertString(length, result, set); length = length + result.length(); if (isAddDivide) { doc.insertString(length, SystemHWUtil.DIVIDING_LINE + SystemHWUtil.CRLF, null); } } catch (BadLocationException e) { e.printStackTrace(); GUIUtil23.warningDialog(e.getMessage()); } } /*** * 在实际使用过程中,应该放在线程中 * * @param in * @param sourceSize * : 输入流的长度,即要读取的字节个数 * @param targfile */ public static void progress(JProgressBar copyProgressBar, InputStream in, long sourceSize, File targfile) { FileOutputStream target = null; try { int bytesArrLeng = 0; if (sourceSize < SystemHWUtil.BUFF_SIZE_1024) {// bytesArrLeng = (int) sourceSize; } else { long shangOne = sourceSize / SystemHWUtil.NUMBER_100; if (shangOne == 0) {// sourceSize<100 shangOne = shangOne + 1; } if (shangOne <= SystemHWUtil.BUFF_SIZE_1024) { bytesArrLeng = (int) shangOne; } else { long shangTwo = shangOne / SystemHWUtil.BUFF_SIZE_1024; if (shangOne % SystemHWUtil.BUFF_SIZE_1024 != 0) { shangTwo = shangTwo + 1L; } bytesArrLeng = (int) (shangOne / shangTwo); } } System.out.println("字节数组的长度是:" + bytesArrLeng); target = new FileOutputStream(targfile); byte[] buffer = new byte[bytesArrLeng]; int byteNum; long hasReadByte = 0L;// 已经读取的字节个数 float result; int progressSize = 0; while ((byteNum = in.read(buffer)) != SystemHWUtil.NEGATIVE_ONE) { target.write(buffer, 0, byteNum); hasReadByte = hasReadByte + byteNum; result = (float) ((double) hasReadByte / sourceSize); progressSize = Math.round(result * SystemHWUtil.NUMBER_100); updateProgress(copyProgressBar, progressSize); } if (progressSize < SystemHWUtil.NUMBER_100) { progressSize = SystemHWUtil.NUMBER_100; updateProgress(copyProgressBar, progressSize); } copyProgressBar.setForeground(Color.blue); } catch (Exception e) { e.printStackTrace(); GUIUtil23.errorDialog(e); // copyFileBtn.setEnabled(true); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); GUIUtil23.errorDialog(e); } in = null; } if (target != null) { try { target.close(); } catch (IOException e) { e.printStackTrace(); GUIUtil23.errorDialog(e); } target = null; } } } /*** * 更新进度条上得进度数字 * * @param copyProgressBar * @param progressSize */ private static void updateProgress(JProgressBar copyProgressBar, int progressSize) { copyProgressBar.setString(progressSize + "%"); copyProgressBar.setValue(progressSize); } /*** * 复制图片到剪切板 * @param image */ public static void setClipboardImage(Container frame, final Image image) { Transferable trans = new Transferable() { @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return image; } throw new UnsupportedFlavorException(flavor); } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] { DataFlavor.imageFlavor }; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return DataFlavor.imageFlavor.equals(flavor); } }; frame.getToolkit().getSystemClipboard().setContents(trans, null); } public static BufferedImage getClipboardImage(Frame frame) { // java.lang.ClassCastException: sun.awt.datatransfer.TransferableProxy cannot be cast to sun.awt.datatransfer.ClipboardTransferable Transferable trans=frame.getToolkit().getSystemClipboard().getContents(null); BufferedImage image=null; // if(trans instanceof ClipboardTransferable){ // ClipboardTransferable clipboardTrans =(ClipboardTransferable)trans; try { if (null != trans && trans.isDataFlavorSupported(DataFlavor.imageFlavor)) { Object obj22=trans.getTransferData(DataFlavor.imageFlavor); if(!ValueWidget.isNullOrEmpty(obj22)){ if(obj22 instanceof BufferedImage){ image=(BufferedImage)obj22; } } } } catch (UnsupportedFlavorException e1) { e1.printStackTrace(); GUIUtil23.errorDialog(e1); } catch (IOException e1) { e1.printStackTrace(); GUIUtil23.errorDialog(e1); } // } /*try { Map map=(Map)ReflectHWUtils.getObjectValue(clipboardTrans, "flavorsToData"); Object val=null; for(Object obj:map.keySet()){ val=map.get(obj); break; } byte[] data=(byte[])ReflectHWUtils.getObjectValue(val, "data"); return data;//(BufferedImage)trans.getTransferData(trans.getTransferDataFlavors()[0]); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); }*/ return image; } /*** * * @param comb * @param urls */ public static void fillComboBox(JComboBox<String> comb,String urls[]){ if(comb==null||ValueWidget.isNullOrEmpty(urls)){ return; } for(int i=0;i<urls.length;i++){ comb.addItem(urls[i]); } } /*** * * @param comb : 下拉框 * @param picUrls : 以;;分割的字符串 */ public static void fillComboBox(JComboBox<String> comb,String picUrls){ if(!ValueWidget.isNullOrEmpty(picUrls)){//为空判断 String urls[]=picUrls.split(Constant2.SHAREDPICDIVISION); ComponentUtil.fillComboBox(comb, SystemHWUtil.unique(urls)); } } public static JComboBox<String> comboBoxSelectedHandle(JComboBox<String> comboBox,final JTextField ipTextField){ if(ValueWidget.isNullOrEmpty(comboBox)){ comboBox = new JComboBox<String>(); } comboBox.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { JComboBox<String> target=(JComboBox<String>)e.getSource(); String selectedPort=(String)target.getSelectedItem(); if(!ValueWidget.isNullOrEmpty(selectedPort)){ ipTextField.setText(selectedPort); } // System.out.println(e.getSource()); } }); comboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { JComboBox<String> target=(JComboBox<String>)e.getSource(); String selectedPort=(String)target.getSelectedItem(); if(!ValueWidget.isNullOrEmpty(selectedPort)){ ipTextField.setText(selectedPort); } } }); return comboBox; } /*** * * @param tc */ public static void trim(JTextComponent tc){ String text=tc.getText(); if(text!=null && text.length()>0){ tc.setText(text.trim()); } } }