2011-12-09 4 views
2

JTable по умолчанию TransferHandler экспортирует данные в формате с разделителями табуляции. Я пытаюсь создать свой собственный TransferHandler, который будет экспортировать данные в виде таблицы HTML, но в настоящее время ничего не копируется в буфер обмена, когда я его использую. Как добавить эту функцию?Скопируйте данные из JTable в качестве HTML

В настоящее время я добавляю следующее TransferHandler к моему столу с помощью table.setTransferHandler(new TableTransferHandler());:

public class TableTransferHandler extends TransferHandler { 
    final static Logger logger = LoggerFactory.getLogger("TableTransferHandler"); 

    @Override 
    protected Transferable createTransferable(JComponent comp) { 
     JTable table = (JTable) comp; 
     logger.debug("creating table selection transferable"); 
     return new TableSelection(table); 
    } 

} 

TableSelection Переводной:

public class TableSelection implements Transferable { 
    final static Logger logger = LoggerFactory.getLogger("TableSelection"); 

    private static DataFlavor HTML_TEXT; 

    private static final List<DataFlavor> flavors = new ArrayList<DataFlavor>(); 

    private JTable table; 

    public TableSelection(JTable table) { 
     this.table = table; 
    } 

    @Override 
    public boolean isDataFlavorSupported(DataFlavor flavor) { 
     return flavors.contains(flavor); 
    } 

    @Override 
    public DataFlavor[] getTransferDataFlavors() { 
     return flavors.toArray(new DataFlavor[0]); 
    } 

    @Override 
    public Object getTransferData(DataFlavor flavor) throws IOException, UnsupportedFlavorException { 
     if (flavor.equals(HTML_TEXT)) { 
      StringBuilder sb = new StringBuilder("<table>"); 
      int[] rows = table.getSelectedRows(); 
      int[] cols = table.getSelectedColumns(); 

      for (int row : rows) { 
       int col_index = 0; 
       sb.append("<tr><td>"); 
       for (int col : cols) { 
        Object value = table.getValueAt(row, col); 
        if (value != null) 
         sb.append(value.toString()); 

        if (col_index + 1 < cols.length) 
         sb.append("</td><td>"); 
       } 
       sb.append("</td></tr>\n"); 
      } 
      sb.append("</table>"); 

      return sb.toString(); 
     } 
     else { 
      throw new UnsupportedFlavorException(flavor); 
     } 
    } 

    static { 

     try { 
      HTML_TEXT = new DataFlavor("text/html;class=java.lang.String"); 
      flavors.add(HTML_TEXT); 
     } 
     catch (ClassNotFoundException e) { 
      logger.error("Couldn't create HTML_TEXT flavor", e); 
     } 
    } 
} 
+0

Что вы имеете в виду, ничего не копируется в буфер обмена. Является ли ваша передача не созданной? И как вы ожидаете, что это сработает. Ваш переносимый содержит только один dataflavor, который является приватным. Итак, как кто-нибудь сможет получить данные из вашего перевода, если у них нет доступа к аромату? – Robin

+0

После CTRL + C на столе я получаю ранее скопированный текст, а не данные из таблицы. Я мог бы сделать все это неправильно, так как это моя первая попытка использовать TransferHandlers. –

+0

Я думал, что [обработчик по умолчанию] (http://docs.oracle.com/javase/1.5.0/docs/guide/swing/1.4/dnd.html#DefaultTransferHandlerSupport) сделал это, но установил 'setDragEnabled (true)' скопированный простой текст. – trashgod

ответ

2

Там только одна часть отсутствует. Вы должны реализовать TransferHandler.getSourceActions, например, так:

public class TableTransferHandler extends TransferHandler { 
    ... 
    @Override 
    public int getSourceActions(JComponent c) { 
     return COPY; 
    } 
} 

EDIT: это работает на Mac OS X. Но на Windows, оклейка к блокноту или Wordpad и работает, но не OpenOffice Calc. После некоторого исследования, я думаю, Java AWT и OpenOffice оба имеют вина:

  • Java производит следующий формат HTML буфер обмена:

    Версия: 0,9
    StartHTML: -1
    EndHTML: -1
    ...

Эти два -1 ошибочны. Предполагается, что они представляют собой некоторые положительные значения смещения. Существует know JDK bug, что очень близко к тому, что у вас здесь.

  • OpenOffice, с другой стороны, может не справиться с таким частично правильным форматом буфер обмена, в то время блокнота или WordPad может. Есть 7300+ (!) open bugs, если вы ищете 'paste html calc' в базе данных OpenOffice bugzilla.
+0

Теперь ведение журнала указывает, что мой пользовательский Transferable используется, но когда я «вставляю специальные» в OpenOffice Calc и выбираю HTML-формат, он говорит: «содержимое буфера обмена не может быть вставлено». Вставка в Thunderbird или Notepad или jEdit не влияет. –

+0

@Bemace работает для меня. Вы меняете свой код после того, как разместили его здесь? – edwardw

+0

Какую ОС вы используете? Он начинает выглядеть как окна требует [некоторые специальные заголовки буфера обмена] (http://msdn.microsoft.com/en-us/library/aa767917%28v=vs.85%29.aspx#unknown_156) –

 Смежные вопросы

  • Нет связанных вопросов^_^