Изменить поведение копирования ячейки JTable - PullRequest
2 голосов
/ 18 января 2012

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

Допустим, у меня есть таблица с двумя столбцами для простоты.В первом столбце содержится Boolean с, а во втором столбце - String с.В настоящее время, когда вы копируете 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);
            }
        });
    }
}

Ответы [ 2 ]

4 голосов
/ 18 января 2012

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

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

2 голосов
/ 18 января 2012

См. этот вопрос SO , где я привел пример пользовательского поведения копирования с использованием SwingX JXTable. Тем не менее, тот же самый подход может быть использован с обычной JTable

...