Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > как скопировать файл в клипбоард?


Автор: cube 24.7.2009, 17:11
собственно сабж, как?

Автор: LSD 24.7.2009, 18:13
Смотря что ты подразумеваешь под файлом. Если нужно поведение аналогичное поведению Explorer, то тебе нужно скопировать в буфер путь к файлу и дать ему data flavor -  DataFlavor.javaFileListFlavor.

Автор: cube 25.7.2009, 14:01
Цитата(LSD @ 24.7.2009,  18:13)
Смотря что ты подразумеваешь под файлом. Если нужно поведение аналогичное поведению Explorer, то тебе нужно скопировать в буфер путь к файлу и дать ему data flavor -  DataFlavor.javaFileListFlavor.

Да именно так и нужно, нашел в этом форуме подобную тему:

http://forum.vingrad.ru/topic-178034.html

так же попробовал использовать но при вставке в эксплорере файла получаю, что системе не удается прочитать файл или каталог с диска или с файла??? почему?

Код

      File f = new File(System.getProperty("user.dir")+File.separator+"workbook.xls");
      FileOutputStream fileOut = new FileOutputStream(f);
      wb.write(fileOut); // здесь записываю из воркбука в файл
      fileOut.close(); // закрываю поток оутпут
      setResource(f); // устанавливаю файл в клипбоард

  }

 public void setResource(File f) {
      FileTransferable rs = new FileTransferable(f);
      Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
      clipboard.setContents(rs, null);
  }

}


class FileTransferable implements Transferable {
    private ArrayList<File> array;
    public FileTransferable(File file) {
        array = new ArrayList<File>();
        add(file);
    }
    public void add(File file) {
        if(file.exists())
            array.add(file);
    }
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { DataFlavor.javaFileListFlavor };
    }
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return DataFlavor.javaFileListFlavor.equals(flavor);
    }
    public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException, IOException {
        if (!isDataFlavorSupported(flavor)) {
            throw new UnsupportedFlavorException(flavor);
        }
        return array;
    }
}



Данный файл создается и записывается значениями, я могу в эксплорере сам скипировать его и потом вставить, но через программу такое не получается

Автор: LSD 27.7.2009, 12:44
Хотелось бы пример, который можно скомпилировать и запустить.

Автор: cube 27.7.2009, 13:29
Цитата(LSD @ 27.7.2009,  12:44)
Хотелось бы пример, который можно скомпилировать и запустить.

Я использую Пои незнаю удобно будет тебе или нет подключить его, но для примера можно закоментить poi а создать простой текстовый файл и вставить его в клипбоард

Код

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *
 * @author Yura Didenko
 */
public class PriceListXslClipboard {

  public PriceListXslClipboard()
  {
    try {
      run();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private void run() throws Exception
  {
      HSSFWorkbook wb = new HSSFWorkbook();
      HSSFSheet sheet = wb.createSheet("новая таблица");

      // Create a row and put some cells in it. Rows are 0 based.
      HSSFRow row = sheet.createRow((short)0);

      // Create a cell and put a date value in it.  The first cell is not styled
      // as a date.
      HSSFCell cell = row.createCell((short)0);
      cell.setCellValue(new Date());

      // we style the second cell as a date (and time).  It is important to
      // create a new cell style from the workbook otherwise you can end up
      // modifying the built in style and effecting not only this cell but other cells.
      HSSFCellStyle cellStyle = wb.createCellStyle();
      cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
      cell = row.createCell((short)1);
      cell.setCellValue(new Date());
      cell.setCellStyle(cellStyle);

      // Write the output to a file
//      System.out.println("path="+);
      File f = new File(System.getProperty("user.dir")+File.separator+"workbook.xls");
      FileOutputStream fileOut = new FileOutputStream(f);
      wb.write(fileOut);
      fileOut.close();
      setResource(f);

  }

 public void setResource(File f) {
      FileTransferable rs = new FileTransferable(f);
      Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
      clipboard.setContents(rs, null);
  }

}


class FileTransferable implements Transferable {
    private ArrayList<File> array;
    public FileTransferable(File file) {
        array = new ArrayList<File>();
        add(file);
    }
    public void add(File file) {
        if(file.exists())
            array.add(file);
    }
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] { DataFlavor.javaFileListFlavor };
    }
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return DataFlavor.javaFileListFlavor.equals(flavor);
    }
    public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException, IOException {
        if (!isDataFlavorSupported(flavor)) {
            throw new UnsupportedFlavorException(flavor);
        }
        return array;
    }
}

Автор: LSD 27.7.2009, 19:24
Вот так:
Код

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;

public class PriceListXslClipboard
{
  public static void main(String[] args) throws Exception
  {
    File f = new File("C:\\TEMP", "readme.txt");
    Writer fileOut = new FileWriter(f);
    fileOut.write("Pish-pish!!111");
    fileOut.close();
    setResource(f);
  }

  public static void setResource(File f)
  {
    FileTransferable rs = new FileTransferable(f);
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(rs, null);
  }

  public static class FileTransferable implements Transferable
  {
    public static final DataFlavor[] FILE_TRANSFER_DATA_FLAVOR = new DataFlavor[]{DataFlavor.javaFileListFlavor};

    private List<File> array;

    public FileTransferable(File... file)
    {
      array = Arrays.asList(file);
    }

    public void add(File file)
    {
      if(file.exists())
        array.add(file);
    }

    public DataFlavor[] getTransferDataFlavors()
    {
      return FILE_TRANSFER_DATA_FLAVOR;
    }

    public boolean isDataFlavorSupported(DataFlavor flavor)
    {
      return DataFlavor.javaFileListFlavor.equals(flavor);
    }

    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException
    {
      if(!isDataFlavorSupported(flavor))
      {
        throw new UnsupportedFlavorException(flavor);
      }
      return array;
    }
  }
}

у меня все работает.

1. Вместо этого безобразия:
Код

new File(System.getProperty("user.dir")+File.separator+"workbook.xls")

используй соответвующий конструктор:
Код

new File(System.getProperty("user.dir"), "workbook.xls")


2. Проверь путь в file, возможно его стоит сконвертировать в канонический:
Код

new File(System.getProperty("user.dir"), "workbook.xls").getCanonicalFile()

Автор: cube 28.7.2009, 11:42
да у тебя работает, я так же попробовал создал каталог на диске туда записал файл в клипбоард вставился, но вот так не работает:

Код

    File f =    new File(System.getProperty("user.dir"), "workbook.txt");
    System.out.println("f="+f);
    f.getCanonicalFile();
    System.out.println("f="+f);
    Writer fileOut = new FileWriter(f);
    fileOut.write("Pish-pish!!111");
    fileOut.close();
    setResource(f);


скриншот

Автор: LSD 28.7.2009, 16:22
1. getCanonicalFile() возвращает новый File
Код

File f = new File(System.getProperty("user.dir"), "workbook.txt").getCanonicalFile();


2. Почему у тебя на переднем плане NetBeans и твое приложение, а не Explorer?

Автор: cube 28.7.2009, 16:35
Цитата(LSD @ 28.7.2009,  16:22)
1. getCanonicalFile() возвращает новый File
Код

File f = new File(System.getProperty("user.dir"), "workbook.txt").getCanonicalFile();


2. Почему у тебя на переднем плане NetBeans и твое приложение, а не Explorer?

И так тоже у меня не получилось ((( Я просто думал что getCanonicalFile() еще и "исправляет путь" на правильный в системе, сейчас почитал в апи понял что он возвращает новый файл.

нетбинс открыт для наглядности (типа у меня такой файл есть, путь к этому файлу такой же как и в нетбинсе, т.е. путь правильный) но при вставке например на рабочий стол, выскакивает эта ошибка...

Я сейчас пробую все варианты, и руками задаю пути, кстати когда задаешь руками путь, так же как в твоем примере все работает Ок, но так как моя программа будет устанавливаться через инсталлер, и я не знаю куда ее установят, хотелось бы чтобы путь к файлу воспринимался именно как System.getProperty("user.dir")

з.ы. спасибо тебе ты помогаешь мне, мне даже не ловко, это моя проблема, а ты выручаешь....

Автор: LSD 29.7.2009, 17:09
Интересная проблемка smile

Вообщем ошибка происходит когда пусть содержит русские буквы, если только латиницу, то все ОК. И проблема как всегда в кодировках smile

NetBeans (впрочем как и большинство IDE) при запуске приложения меняет умолчальную кодировку (обычно на UTF-8, как на самую универсальную) и именно ее использует приложение при передаче данный ОС. Т.е. Windows ожидает данный в windows-1251 кодировке, а получает в UTF-8. Соответвенно вместо нормального пути она получает обракадабру которую не может прочитать. Надо или изменить настройки NetBeans и сказать, чтобы он не трогал умолчальную кодировку, или запускать из командной строки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)