读书人

Java JTable 怎么跨表格拖拽行

发布时间: 2013-06-19 10:26:41 作者: rapoo

Java JTable 如何跨表格拖拽行
想实现选中表格A中行,鼠标拖拽至表格B,就将选中行复制到表格B中,如何实现呀,求大大帮助,谢谢啦O(∩_∩)O~ Java jtable 拖拽
[解决办法]
这个就是分界面处理和业务处理了。界面就是要做到当你选中一行的进行监听,当鼠标拖拽的时候,鼠标显示成呗拖拽的样子。然后到B表的时候,B表在相应位置增加一条记录,而A表删除一行记录。这样看起来好像是由A表拖拽过去一样。业务层要相应的做处理。当界面做完相应的动作的时候,要把A表选中的一样删除,并复制到B表中。就是更新JTable中的TableModel。这样就OK了。
[解决办法]
对于拖拽我没有做过相应的项目,要是不急着要的话,我有空去写写,再给你。
[解决办法]
下面是实现 拖拽上面的JTable 到下面的的JTable的代码,


import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.dnd.*;
import java.awt.datatransfer.*;
import java.awt.*;

class MyFrame extends JFrame
{
private JTable tb1;
private JTable tb2;

public MyFrame()
{
setBounds(0,0,800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Box box = Box.createVerticalBox();

//通过DefaultTableModel给tb1加点数据
box.add(new JLabel("拖拽源"));

String[][] tableDatas = {
new String[]{"张飞","男"},
new String[]{"关羽","男"},
new String[]{"刘备","男"},
new String[]{"貂蝉","女"}};

String[] title = {"姓名","性别"};
tb1 = new JTable(tableDatas,title);
box.add(new JScrollPane(tb1));

//将tb1 做成拖放源
DragSource dragSource = DragSource.getDefaultDragSource();
dragSource.createDefaultDragGestureRecognizer(tb1,
DnDConstants.ACTION_COPY_OR_MOVE,
new DragGestureListener()
{
public void dragGestureRecognized(DragGestureEvent event)
{
//当前选择中单元格的内容
TableModel tableModel = (TableModel) tb1.getModel();
int row = tb1.getSelectedRow();
int col = tb1.getSelectedColumn();
String s = (String)tableModel.getValueAt(row,col);
Transferable transferable = new StringSelection(s);
event.startDrag(
DragSource.DefaultCopyDrop,
transferable);

}
});

box.add(new JLabel("拖拽目标"));

String[][] tableDatas2 = {new String[]{"",""},new String[]{"",""}};
tb2 = new JTable(tableDatas2,title);
box.add(new JScrollPane(tb2));
add(box);

final TableModel tablemodel = tb2.getModel();
//将tb2做为拖放目标
new DropTarget(tb2,DnDConstants.ACTION_COPY,new DropTargetAdapter()
{
@Override
public void drop(DropTargetDropEvent event)
{
try
{
event.acceptDrop(DnDConstants.ACTION_COPY);
Transferable transferable = event.getTransferable();
DataFlavor[] flavors = transferable.getTransferDataFlavors();
//这里简单起见就取0号,


DataFlavor data = flavors[0];
String s = (String)transferable.getTransferData(data);
//得到当前的鼠标位置
Point p = event.getLocation();
//获得当前鼠标所在的行、列
int row = tb2.rowAtPoint(p);
int col = tb2.columnAtPoint(p);
tablemodel.setValueAt(s,row,col);
//免得阻塞进程
event.dropComplete(true);
}
catch (Exception e)
{
event.dropComplete(true);
e.printStackTrace();
}
}
});

pack();
setVisible(true);
}
}


public class TableDrag
{
public static void main(String[] args)
{
new MyFrame();
System.out.println("Hello World!");
}
}



[解决办法]
本质思想
1、使用DragSource 建立拖放源头;
2、使用DropTarget建立拖放目标
3、使用Transferable和DataFlavor 作为拖放的数据传递,我传递的是表格中的文字
String s = (String)tableModel.getValueAt(row,col);
Transferable transferable = new StringSelection(s);

4、接收的时候用鼠标位置判断 行列,设置目标行列的文本 不过看jdk1.7的文档应该还可用JTable.DropLocation 本质其实一样的。

5、如果实现更复杂的拖拽,就强化Transferable 和 DataFlavor 这块。

读书人网 >J2SE开发

热点推荐