Java JTable 如何跨表格拖拽行

xn_28 2013-05-31 04:47:41
想实现选中表格A中行,鼠标拖拽至表格B,就将选中行复制到表格B中,如何实现呀,求大大帮助,谢谢啦O(∩_∩)O~
...全文
423 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xn_28 2013-06-05
  • 打赏
  • 举报
回复
引用 9 楼 N27741 的回复:
[quote=引用 7 楼 xn_28 的回复:] [quote=引用 6 楼 N27741 的回复:] 本质思想 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[/quote] 按单元格拖拽都实现了,按行还不是很easy的事情?[/quote] 唔。。那透明拖拽效果和这个肿么才能不冲突呢。。。我试过好多次。。。好像都不行。。。同时调用会卡屏。。求助啊
n27741 2013-06-04
  • 打赏
  • 举报
回复
引用 7 楼 xn_28 的回复:
[quote=引用 6 楼 N27741 的回复:] 本质思想 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[/quote] 按单元格拖拽都实现了,按行还不是很easy的事情?
xn_28 2013-06-04
  • 打赏
  • 举报
回复
引用 4 楼 u010300707 的回复:
对于拖拽我没有做过相应的项目,要是不急着要的话,我有空去写写,再给你。
O(∩_∩)O谢谢啦~
xn_28 2013-06-04
  • 打赏
  • 举报
回复
引用 6 楼 N27741 的回复:
本质思想 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
n27741 2013-06-04
  • 打赏
  • 举报
回复
本质思想 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 这块。
n27741 2013-06-04
  • 打赏
  • 举报
回复
下面是实现 拖拽上面的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!");
	}
}


点点_123 2013-06-03
  • 打赏
  • 举报
回复
对于拖拽我没有做过相应的项目,要是不急着要的话,我有空去写写,再给你。
xn_28 2013-06-03
  • 打赏
  • 举报
回复
引用 1 楼 u010300707 的回复:
这个就是分界面处理和业务处理了。界面就是要做到当你选中一行的进行监听,当鼠标拖拽的时候,鼠标显示成呗拖拽的样子。然后到B表的时候,B表在相应位置增加一条记录,而A表删除一行记录。这样看起来好像是由A表拖拽过去一样。业务层要相应的做处理。当界面做完相应的动作的时候,要把A表选中的一样删除,并复制到B表中。就是更新JTable中的TableModel。这样就OK了。
求简单代码做例子,菜鸟真心不太懂,求大大帮助
xn_28 2013-06-03
  • 打赏
  • 举报
回复
求简单的代码说明,菜鸟不会啊→ →
点点_123 2013-05-31
  • 打赏
  • 举报
回复
这个就是分界面处理和业务处理了。界面就是要做到当你选中一行的进行监听,当鼠标拖拽的时候,鼠标显示成呗拖拽的样子。然后到B表的时候,B表在相应位置增加一条记录,而A表删除一行记录。这样看起来好像是由A表拖拽过去一样。业务层要相应的做处理。当界面做完相应的动作的时候,要把A表选中的一样删除,并复制到B表中。就是更新JTable中的TableModel。这样就OK了。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧