JTable копировать и вставлять с использованием буфера обмена и AbstractAction
Когда я пытаюсь вставить вJTable
использование клеткиtable.setValueAt()
клетка, в которую я вставляю, остается пустой, ноsetValueAt()
кажется, работает. Кроме того, когда я пытаюсьрезать или жекопия из одной ячейки, опция Вставить на моемJPopupMenu
остается отключенным, когда я хочу вставить в другую ячейку. Я не уверен почему. Мой код ниже.
class CopyAction extends AbstractAction {
private JTable table;
public CopyAction(JTable table)
{
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e)
{
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.setContents(new CellTransferable(table.getValueAt(row, col)), null);
}
}
class CutAction extends AbstractAction {
private JTable table;
public CutAction(JTable table)
{
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e)
{
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.setContents(new CellTransferable(table.getValueAt(row, col)), null);
}
}
class PasteAction extends AbstractAction {
private JTable table;
private GridModel gridModel;
public PasteAction(JTable tbl, GridModel gm)
{
gridModel = gm;
table = tbl;
final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.addFlavorListener(new FlavorListener() {
@Override
public void flavorsChanged(FlavorEvent e)
{
setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));
}
});
setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));
}
@Override
public void actionPerformed(ActionEvent e)
{
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
if (cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR))
{
try
{
Object value = cb.getData(CellTransferable.CELL_DATA_FLAVOR);
System.out.println(value);
table.setValueAt(value, row, col);
}
catch (UnsupportedFlavorException | IOException ex)
{
ex.printStackTrace();
}
}
}
}
class CellTransferable implements Transferable {
public static final DataFlavor CELL_DATA_FLAVOR = new DataFlavor(Object.class, "application/x-cell-value");
private Object cellValue;
public CellTransferable(Object cellValue) {
this.cellValue = cellValue;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{CELL_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return CELL_DATA_FLAVOR.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (!isDataFlavorSupported(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return cellValue;
}
}
Вот мой код дляsetValueAt()
class MyModel extends AbstractTableModel
{
private String[] names = {"1", "2", "3", "4", "5" };
private String[][] values = new String[5][5];
//...other methods
public void setValueAt(Object value, int row, int col)
{
if (value instanceof Double || value instanceof Integer)
values[row][col] = value.toString();
else
{
values[row][col] = (String) value;
}
fireTableCellUpdated(row, col);
}
}