Java 如何在JTable中拖放一行?
如何设置JTable,以便能够将行拖动到表中的其他索引。例如,如果我有5行,我想将第4行拖到第2个位置?查看Java教程的部分。以下是一些关于如何为Java 如何在JTable中拖放一行?,java,swing,drag-and-drop,jtable,mouse,Java,Swing,Drag And Drop,Jtable,Mouse,如何设置JTable,以便能够将行拖动到表中的其他索引。例如,如果我有5行,我想将第4行拖到第2个位置?查看Java教程的部分。以下是一些关于如何为JTable实现此功能的示例,例如: table.addMouseMotionListener(new MouseMotionListener() { public void mouseDragged(MouseEvent e) { e.consume(); JComponent c = (JCompo
JTable
实现此功能的示例,例如:
table.addMouseMotionListener(new MouseMotionListener() {
public void mouseDragged(MouseEvent e) {
e.consume();
JComponent c = (JComponent) e.getSource();
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.MOVE);
}
public void mouseMoved(MouseEvent e) {
}
});
以下允许对单个拖动行进行JTable重新排序:
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table));
您的TableModel应实现以下功能以允许重新订购:
public interface Reorderable {
public void reorder(int fromIndex, int toIndex);
}
此TransferHandler类处理拖放操作,并在手势完成时对TableModel调用reorder()
/**
* Handles drag & drop row reordering
*/
public class TableRowTransferHandler extends TransferHandler {
private final DataFlavor localObjectFlavor = new ActivationDataFlavor(Integer.class, "application/x-java-Integer;class=java.lang.Integer", "Integer Row Index");
private JTable table = null;
public TableRowTransferHandler(JTable table) {
this.table = table;
}
@Override
protected Transferable createTransferable(JComponent c) {
assert (c == table);
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
}
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport info) {
JTable target = (JTable) info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
int index = dl.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max)
index = max;
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
((Reorderable)table.getModel()).reorder(rowFrom, index);
if (index > rowFrom)
index--;
target.getSelectionModel().addSelectionInterval(index, index);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable t, int act) {
if ((act == TransferHandler.MOVE) || (act == TransferHandler.NONE)) {
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
/**
*处理拖放行重新排序
*/
公共类TableRowTransferHandler扩展了TransferHandler{
private final DataFlavor localObjectFlavor=new ActivationDataFlavor(Integer.class,“application/x-java-Integer;class=java.lang.Integer”,“整数行索引”);
私有JTable表=null;
公共表RowTransferHandler(JTable表){
this.table=表格;
}
@凌驾
受保护的可转让组件(JComponent c){
断言(c==表);
返回新的DataHandler(新的整数(table.getSelectedRow()),localObjectFlavor.getMimeType());
}
@凌驾
公共布尔值canImport(TransferHandler.TransferSupport信息){
布尔b=info.getComponent()==table&&info.isDrop()&&info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b?DragSource.DefaultMoveDrop:DragSource.DefaultMoveNoDrop);
返回b;
}
@凌驾
public int getSourceActions(JComponent c){
返回TransferHandler.COPY\u或\u MOVE;
}
@凌驾
公共布尔输入数据(TransferHandler.TransferSupport信息){
JTable target=(JTable)info.getComponent();
JTable.DropLocation dl=(JTable.DropLocation)info.getDropLocation();
int index=dl.getRow();
int max=table.getModel().getRowCount();
如果(索引<0 | |索引>最大值)
指数=最大值;
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_Cursor));
试一试{
整数rowFrom=(整数)info.getTransferable().getTransferData(localObjectFlavor);
if(rowFrom!=-1&&rowFrom!=索引){
((可重定向)table.getModel()).reorder(rowFrom,index);
如果(索引>行起始)
索引--;
target.getSelectionModel().addSelectionInterval(索引,索引);
返回true;
}
}捕获(例外e){
e、 printStackTrace();
}
返回false;
}
@凌驾
受保护无效输出完成(JC组件c、可转让t、int法案){
if((act==TransferHandler.MOVE)| |(act==TransferHandler.NONE)){
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_Cursor));
}
}
}
仅用于记录和多行重新排序:
public interface Reorderable {
public void reorder(int fromIndex, int toIndex);
}
在某处使用
JTable table = t_objects;
table.setDragEnabled(true);
table.setDropMode(DropMode.INSERT_ROWS);
table.setTransferHandler(new TableRowTransferHandler(table));
这是上面答案中的主要类,我修改了它以匹配多行DnD的需要。
我所做的只是使用第一个选中的行,然后计算放置位置上方的行。已删除选定项并将其保留在对象列表中(行数组对象)。然后将它们插入到计算行。最后选择删除/拖动的行以完成该过程
public class TableRowTransferHandler extends TransferHandler {
private final DataFlavor localObjectFlavor = new DataFlavor(Integer.class, "Integer Row Index");
private JTable table = null;
public TableRowTransferHandler(JTable table) {
this.table = table;
}
@Override
protected Transferable createTransferable(JComponent c) {
assert (c == table);
return new DataHandler(new Integer(table.getSelectedRow()), localObjectFlavor.getMimeType());
}
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
boolean b = info.getComponent() == table && info.isDrop() && info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b ? DragSource.DefaultMoveDrop : DragSource.DefaultMoveNoDrop);
return b;
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY_OR_MOVE;
}
@Override
public boolean importData(TransferHandler.TransferSupport info) {
JTable target = (JTable) info.getComponent();
JTable.DropLocation dl = (JTable.DropLocation) info.getDropLocation();
int index = dl.getRow();
int max = table.getModel().getRowCount();
if (index < 0 || index > max) {
index = max;
}
target.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
try {
Integer rowFrom = (Integer) info.getTransferable().getTransferData(localObjectFlavor);
if (rowFrom != -1 && rowFrom != index) {
int[] rows = table.getSelectedRows();
int dist = 0;
for (int row : rows) {
if (index > row) {
dist++;
}
}
index -= dist;
//**TableUtil** is a simple class that just copy, remove and select rows.
ArrayList<Object> list = TableUtil.getSelectedList(table);
TableUtil.removeSelected(table);
ArrayList<Integer> sels = new ArrayList<Integer>();
for (Object obj : list) {
sels.add(index);
TableUtil.addRowAt(table, obj, index++);
}
TableUtil.selectMultipleRow(table, sels);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void exportDone(JComponent c, Transferable t, int act) {
if (act == TransferHandler.MOVE) {
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}
公共类TableRowTransferHandler扩展了TransferHandler{
private final DataFlavor localObjectFlavor=new DataFlavor(Integer.class,“整数行索引”);
私有JTable表=null;
公共表RowTransferHandler(JTable表){
this.table=表格;
}
@凌驾
受保护的可转让组件(JComponent c){
断言(c==表);
返回新的DataHandler(新的整数(table.getSelectedRow()),localObjectFlavor.getMimeType());
}
@凌驾
公共布尔值canImport(TransferHandler.TransferSupport信息){
布尔b=info.getComponent()==table&&info.isDrop()&&info.isDataFlavorSupported(localObjectFlavor);
table.setCursor(b?DragSource.DefaultMoveDrop:DragSource.DefaultMoveNoDrop);
返回b;
}
@凌驾
public int getSourceActions(JComponent c){
返回TransferHandler.COPY\u或\u MOVE;
}
@凌驾
公共布尔输入数据(TransferHandler.TransferSupport信息){
JTable target=(JTable)info.getComponent();
JTable.DropLocation dl=(JTable.DropLocation)info.getDropLocation();
int index=dl.getRow();
int max=table.getModel().getRowCount();
如果(索引<0 | |索引>最大值){
指数=最大值;
}
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_Cursor));
试一试{
整数rowFrom=(整数)info.getTransferable().getTransferData(localObjectFlavor);
if(rowFrom!=-1&&rowFrom!=索引){
int[]行=table.getSelectedRows();
int-dist=0;
for(int行:行){
如果(索引>行){
dist++;
}
}
指数-=距离;
//**TableUtil**是一个简单的类,只需复制、删除和选择行。
ArrayList list=TableUtil.getSelectedList(表);
TableUtil.removeSelected(表);
ArrayList sels=新的ArrayList();
对于(对象对象:列表){
选择添加(索引);
TableUtil.addRowAt(table,obj,index++);
}
TableUtil.selectMultipleRow(表,sels);
返回true;
}
}捕获(例外e){
e、 printStackTrace();
}
返回false;
}
@凌驾
受保护无效输出完成(JC组件c、可转让t、int法案){
if(act==TransferHandler.MOVE){
table.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_Cursor));
}
}
}
我喜欢索利的m