Java 如何通过拖放来交换jtable中单元格的值
我想将表的数据从一个表交换到同一列中的另一个表(注意:我只有两列) 我的问题是我无法交换值。此外,我希望仅在同一列上启用交换,否则,表值将重置为其原始值 这是我的密码:Java 如何通过拖放来交换jtable中单元格的值,java,swing,drag-and-drop,Java,Swing,Drag And Drop,我想将表的数据从一个表交换到同一列中的另一个表(注意:我只有两列) 我的问题是我无法交换值。此外,我希望仅在同一列上启用交换,否则,表值将重置为其原始值 这是我的密码: JTable table_1 = new JTable(model); table_1.setPreferredScrollableViewportSize(new Dimension(300, 120)); table_1.setDragEnabled(true); table_1.setDropMode(Drop
JTable table_1 = new JTable(model);
table_1.setPreferredScrollableViewportSize(new Dimension(300, 120));
table_1.setDragEnabled(true);
table_1.setDropMode(DropMode.USE_SELECTION);
table_1.setTransferHandler(new TransferHelper());
table_1.setRowSelectionAllowed(false);
table_1.setCellSelectionEnabled(true);
我的TransferHelper类:
class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
String data = (String) ((JTable) source).getModel().getValueAt(((JTable) source).getSelectedRow(), ((JTable) source).getSelectedColumn());
return new StringSelection(data);
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
((JTable) source).getModel().setValueAt("", ((JTable) source).getSelectedRow(), ((JTable) source).getSelectedColumn());
}
@Override
public boolean canImport(TransferSupport support) {
return true;
}
@Override
public boolean importData(TransferSupport support) {
JTable jt = (JTable) support.getComponent();
try {
jt.setValueAt(support.getTransferable().getTransferData(DataFlavor.stringFlavor), jt.getSelectedRow(), jt.getSelectedColumn());
} catch (UnsupportedFlavorException ex) {
} catch (IOException ex) {
}
return super.importData(support);
}
}
拖放不是一个简单的过程,它相当复杂和复杂。这种复杂性带来了灵活性 以这种方式交换值本身与“移动”不同。当移动某物时,您从源中获取它并将其放置在目标中,这里我们在源和目标之间交换值,这意味着我们需要比通常通过API获得的更多的信息 首先,您需要一个自定义类来保存要导出的数据,因为我们正在移动数据,这需要一些额外的信息,特别是源组件 下面只是一个简单的包装器。我们可以完全导出
JTable
,但我想演示拖放的基本概念
import javax.swing.JTable;
public class CellData {
private JTable table;
public CellData(JTable table) {
this.table = table;
}
public int getColumn() {
return table.getSelectedColumn();
}
public String getValue() {
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
return (String) table.getValueAt(row, col);
}
public JTable getTable() {
return table;
}
}
接下来,我们需要一个定制的可转移的来管理我们的数据
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class CellDataTransferable implements Transferable {
public static final DataFlavor CELL_DATA_FLAVOR = createConstant(CellData.class, "application/x-java-celldata");
private CellData cellData;
public CellDataTransferable(CellData cellData) {
this.cellData = cellData;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{CELL_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
boolean supported = false;
for (DataFlavor available : getTransferDataFlavors()) {
if (available.equals(flavor)) {
supported = true;
}
}
return supported;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return cellData;
}
static protected DataFlavor createConstant(Class clazz, String name) {
try {
return new DataFlavor(clazz, name);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
最后,TransferHandler
public class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
// Create the transferable
// Because I'm hacking a little, I've included the source table...
JTable table = (JTable) source;
return new CellDataTransferable(new CellData(table));
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
}
@Override
public boolean canImport(TransferSupport support) {
// Reject the import by default...
boolean canImport = false;
// Can only import into another JTable
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable table = (JTable) comp;
// Need the location where the drop might occur
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
// Get the column at the drop point
int dragColumn = table.columnAtPoint(dp);
try {
// Get the Transferable, we need to check
// the constraints
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CellDataTransferable.CELL_DATA_FLAVOR);
// Make sure we're not dropping onto ourselves...
if (cd.getTable() != table) {
// Do the columns match...?
if (dragColumn == cd.getColumn()) {
canImport = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return canImport;
}
@Override
public boolean importData(TransferSupport support) {
// Import failed for some reason...
boolean imported = false;
// Only import into JTables...
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need to know where we are importing to...
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
int dropCol = target.columnAtPoint(dp);
int dropRow = target.rowAtPoint(dp);
try {
// Get the Transferable at the heart of it all
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CellDataTransferable.CELL_DATA_FLAVOR);
if (cd.getTable() != target) {
// Make sure the columns match
if (dropCol == cd.getColumn()) {
// Get the data from the "dropped" table
String exportValue = (String) target.getValueAt(dropRow, dropCol);
// Get the data from the "dragged" table
String importValue = cd.getValue();
// This is where we swap the values...
// Set the target/dropped tables value
target.setValueAt(importValue, dropRow, dropCol);
// Set the source/dragged tables values
JTable source = cd.getTable();
int row = source.getSelectedRow();
int col = source.getSelectedColumn();
source.setValueAt(exportValue, row, col);
imported = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return imported;
}
}
阅读评论:p
最后,一个可运行的示例
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import static javax.swing.TransferHandler.MOVE;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TableSwap {
public static void main(String[] args) {
new TableSwap();
}
public TableSwap() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable t1 = createTable(0);
JTable t2 = createTable(20);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(0, 2));
frame.add(new JScrollPane(t1));
frame.add(new JScrollPane(t2));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected JTable createTable(int startAt) {
DefaultTableModel model = new DefaultTableModel(0, 2);
for (int index = 0; index < 10; index++) {
model.addRow(new Object[]{"0x" + (index + startAt), "1x" + (index + startAt)});
}
JTable table = new JTable(model);
table.setDragEnabled(true);
table.setDropMode(DropMode.USE_SELECTION);
table.setTransferHandler(new TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(true);
return table;
}
}
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.Point;
导入java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.datatransfer.UnsupportedFlavorException;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.DropMode;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.TransferHandler;
导入静态javax.swing.TransferHandler.MOVE;
导入javax.swing.TransferHandler.TransferSupport;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.DefaultTableModel;
公共类表WAP{
公共静态void main(字符串[]args){
新表wap();
}
公共表wap(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JTable t1=createTable(0);
JTable t2=createTable(20);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的GridLayout(0,2));
frame.add(新的JScrollPane(t1));
frame.add(新的JScrollPane(t2));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
受保护的JTable createTable(int startAt){
DefaultTableModel=新的DefaultTableModel(0,2);
对于(int-index=0;index<10;index++){
addRow(新对象[]{“0x”+(index+startAt),“1x”+(index+startAt)});
}
JTable table=新的JTable(模型);
表2.setDragEnabled(真);
table.setDropMode(DropMode.USE_选择);
table.setTransferHandler(新的TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(真);
返回表;
}
}
更新为仅支持单个表
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import javax.swing.DropMode;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import static javax.swing.TransferHandler.MOVE;
import javax.swing.TransferHandler.TransferSupport;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TableSwap {
public static void main(String[] args) {
new TableSwap();
}
public TableSwap() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable t1 = createTable(0);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(t1));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected JTable createTable(int startAt) {
DefaultTableModel model = new DefaultTableModel(0, 2);
for (int index = 0; index < 10; index++) {
model.addRow(new Object[]{"0x" + (index + startAt), "1x" + (index + startAt)});
}
JTable table = new JTable(model);
table.setDragEnabled(true);
table.setDropMode(DropMode.USE_SELECTION);
table.setTransferHandler(new TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(true);
return table;
}
public class CellData {
private final Object value;
private final int col;
private final JTable table;
private final int row;
public CellData(JTable source) {
this.col = source.getSelectedColumn();
this.row = source.getSelectedRow();
this.value = source.getValueAt(row, col);
this.table = source;
}
public int getColumn() {
return col;
}
public Object getValue() {
return value;
}
public JTable getTable() {
return table;
}
public boolean swapValuesWith(int targetRow, int targetCol) {
boolean swapped = false;
if (targetCol == col) {
Object exportValue = table.getValueAt(targetRow, targetCol);
table.setValueAt(value, targetRow, targetCol);
table.setValueAt(exportValue, row, col);
swapped = true;
}
return swapped;
}
}
public static final DataFlavor CELL_DATA_FLAVOR = createConstant(CellData.class, "application/x-java-celldata");
public class CellDataTransferable implements Transferable {
private CellData cellData;
public CellDataTransferable(CellData cellData) {
this.cellData = cellData;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{CELL_DATA_FLAVOR};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
boolean supported = false;
for (DataFlavor available : getTransferDataFlavors()) {
if (available.equals(flavor)) {
supported = true;
}
}
return supported;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
return cellData;
}
}
static protected DataFlavor createConstant(Class clazz, String name) {
try {
return new DataFlavor(clazz, name);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public class TransferHelper extends TransferHandler {
private static final long serialVersionUID = 1L;
public TransferHelper() {
}
@Override
public int getSourceActions(JComponent c) {
return MOVE;
}
@Override
protected Transferable createTransferable(JComponent source) {
// Create the transferable
JTable table = (JTable) source;
int row = table.getSelectedRow();
int col = table.getSelectedColumn();
Object value = table.getValueAt(row, col);
return new CellDataTransferable(new CellData(table));
}
@Override
protected void exportDone(JComponent source, Transferable data, int action) {
}
@Override
public boolean canImport(TransferSupport support) {
// Reject the import by default...
boolean canImport = false;
// Can only import into another JTable
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need the location where the drop might occur
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
// Get the column at the drop point
int dragColumn = target.columnAtPoint(dp);
try {
// Get the Transferable, we need to check
// the constraints
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CELL_DATA_FLAVOR);
// Make sure we're not dropping onto ourselves...
if (cd.getTable() == target) {
// Do the columns match...?
if (dragColumn == cd.getColumn()) {
canImport = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return canImport;
}
@Override
public boolean importData(TransferSupport support) {
// Import failed for some reason...
boolean imported = false;
// Only import into JTables...
Component comp = support.getComponent();
if (comp instanceof JTable) {
JTable target = (JTable) comp;
// Need to know where we are importing to...
DropLocation dl = support.getDropLocation();
Point dp = dl.getDropPoint();
int dropCol = target.columnAtPoint(dp);
int dropRow = target.rowAtPoint(dp);
try {
// Get the Transferable at the heart of it all
Transferable t = support.getTransferable();
CellData cd = (CellData) t.getTransferData(CELL_DATA_FLAVOR);
if (cd.getTable() == target) {
if (cd.swapValuesWith(dropRow, dropCol)) {
imported = true;
}
}
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace();
}
}
return imported;
}
}
}
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入java.awt.Point;
导入java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.datatransfer.UnsupportedFlavorException;
导入java.io.IOException;
导入javax.swing.DropMode;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.TransferHandler;
导入静态javax.swing.TransferHandler.MOVE;
导入javax.swing.TransferHandler.TransferSupport;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.DefaultTableModel;
公共类表WAP{
公共静态void main(字符串[]args){
新表wap();
}
公共表wap(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JTable t1=createTable(0);
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的JScrollPane(t1));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
受保护的JTable createTable(int startAt){
DefaultTableModel=新的DefaultTableModel(0,2);
对于(int-index=0;index<10;index++){
addRow(新对象[]{“0x”+(index+startAt),“1x”+(index+startAt)});
}
JTable table=新的JTable(模型);
表2.setDragEnabled(真);
table.setDropMode(DropMode.USE_选择);
table.setTransferHandler(新的TransferHelper());
table.setRowSelectionAllowed(false);
table.setCellSelectionEnabled(真);
返回表;
}
公共类单元数据{
私人最终目的价值;
脉波重复间隔