2012-01-18 2 views
2

По умолчанию при попытке копирования из JTable метод toString копируемого значения отправляется в буфер обмена. Как я могу изменить это поведение для одного класса объектов?Изменение поведения копирования ячейки JTable

Предположим, у меня есть таблица с двумя колонками для простоты. Первая колонка имеет Boolean s, а вторая колонка имеет String s. В настоящее время, когда вы копируете Boolean, вы получаете либо true, либо false. Как я могу изменить это поведение, чтобы разместить произвольную строку в буфере обмена (скажем t для true и f для false) без изменения порядка копирования String?

Здесь находится SSCCE, где вы можете копировать/вставлять из JTable.

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.table.AbstractTableModel; 

public class ChangeCopyBehavior { 
    private static class TestModel extends AbstractTableModel { 
     private static final long serialVersionUID = -774558262249729206L; 

     @Override 
     public int getRowCount() { 
      return 4; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Class<?> getColumnClass(int col) { 
      return col == 0 ? Boolean.class : String.class; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      if (columnIndex == 1) { 
       return "String"; 
      } else { 
       return rowIndex % 2 == 0; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JTable table = new JTable(new TestModel()); 
       table.setCellSelectionEnabled(true); 

       JPanel panel = new JPanel(); 
       panel.setLayout(new BorderLayout()); 
       panel.add(new JScrollPane(table), BorderLayout.CENTER); 
       panel.add(new JTextArea("Paste stuff here"), BorderLayout.SOUTH); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
       frame.setContentPane(panel); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

Возможный дубликат [Выбор строки пароля и Вставка в блокнот показывает пароль] (http://stackoverflow.com/questions/8776754/selecting-password-row-and -pasting-в-блокнота-открывает-The-пароль) – Robin

ответ

4

Создайте пользовательский TransferHandler, чтобы экспортировать данные в любом формате.

Вот ссылка на старый ExtendedDnDDemo из учебника Swing, в котором показан пример пользовательского TableTransferHandler.

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