Java JTable 如何跨表格拖拽行 想实现选中表格A中行,鼠标拖拽至表格B,就将选中行复制到表格B中,如何实现呀,求大大帮助,谢谢啦O(∩_∩)O~Javajtable拖拽 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个就是分界面处理和业务处理了。界面就是要做到当你选中一行的进行监听,当鼠标拖拽的时候,鼠标显示成呗拖拽的样子。然后到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 这块。 O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html按单元格拖拽都实现了,按行还不是很easy的事情? O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html按单元格拖拽都实现了,按行还不是很easy的事情?唔。。那透明拖拽效果和这个肿么才能不冲突呢我试过好多次好像都不行同时调用会卡屏。。求助啊 帮忙测试下代码。。。 算法解答 java鼠标光标自定义后,为什么不支持透明啊? java获取系统时间问题 如何调用一个已有的.JAR程序并定期运行? 简单的抛出异常的问题 ~~是高手的进来说句话~~关于finally~~ 关于图像滚动后,显示不正常的问题。各位大虾帮帮忙。我会急死了。在线等待。谢谢 创建和使用接口问题,怎么出错? 初学者问题--关于package 如何让JFrame在操作系统任务栏上面,求助 动态编译Java源代码
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 这块。
O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html
O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html按单元格拖拽都实现了,按行还不是很easy的事情?
O(∩_∩)O谢谢啦~是不是要是要以行为拖拽单位的话,就把传递的变为/分割的字符串呢还有,我想实现拖拽的效果展示,用了一个透明拖拽的包,但是在mouseDragged()方法里handler.exportAsDrag(c,e,T.COPY);和透明拖拽的glassPane.repaint();有冲突,不能同时实现,求解ps:透明拖拽代码 http://blog.sina.com.cn/s/blog_77694e440100s7fl.html按单元格拖拽都实现了,按行还不是很easy的事情?
唔。。那透明拖拽效果和这个肿么才能不冲突呢我试过好多次好像都不行同时调用会卡屏。。求助啊