`
空空儿
  • 浏览: 136415 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

JTabel实现行的拖动

阅读更多
现在一直都在弄Java Swing的开发,因本来就不怎么深入的去了解过,对Swing还是处于刚出发的慢跑阶段。前几天一直都被JLabel实现行的拖动困扰着,想达到像JLabel的列头那样拖动的效果,今天终于解决了。现在就拿来分享一下,以后谁碰到这样的需求也不用像我这么头痛了。。。
     1、开始的想法是通过对JTable监听鼠标事件,通过MousePressed() 、MouseDragged()、MouseRelessed()这三个事件来处理,重写TransferHandler和Transferable类。但是里面的逻辑一直都么理清。另外是,用选中的行 获得数据生成图片来处理,选中的行数据另外存储起来,当图片拖动的哪一行的时候,释放(MouseRelessed()),图片消失,再把先前保存的数据插入移动到的位置的前一行。图片生成了,但是怎么拖动呢?怎么把图片添加到JTable上面呢,就要实现刷新(而且我也不会),通过加到组件上面(JLabel)上面,结果失败。。。(以后谁有兴趣可以去试试,这两个都应该是可以实现的)
  2、刚刚用到了另外的一种方法,当然也是在他人提供的资料下并指点之下才得以完成(当然代码并不是我写,只是帮助了我解决,这东西找起来好麻烦,嘿嘿。。),给JTable设置UI. JTable.setUI(); 这个UI是直接实现了表格的行拖动的,只要直接调用就额可以了。。。

[void setUI(TableUI ui)
          设置呈现此组件并进行重新绘制的 L&F 对象。]

****************************************************************************
//实现了表格行的拖动 )
  import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import javax.swing.JComponent; 
import javax.swing.event.MouseInputListener; 
import javax.swing.plaf.basic.BasicTableUI; 
import javax.swing.table.TableModel; 
public class DragDropRowTableUI extends BasicTableUI { 

private boolean draggingRow = false; 
private int startDragPoint; 
private int dyOffset; 

    protected MouseInputListener createMouseInputListener() { 
        return new DragDropRowMouseInputHandler(); 
    } 
     
    public void paint(Graphics g, JComponent c) { 
     super.paint(g, c); 
     
     if (draggingRow) { 
      g.setColor(table.getParent().getBackground()); 
   Rectangle cellRect = table.getCellRect(table.getSelectedRow(), 0, false); 
      g.copyArea(cellRect.x, cellRect.y, table.getWidth(), table.getRowHeight(), cellRect.x, dyOffset); 
       
      if (dyOffset < 0) { 
       g.fillRect(cellRect.x, cellRect.y + (table.getRowHeight() + dyOffset), table.getWidth(), (dyOffset * -1)); 
      } else { 
       g.fillRect(cellRect.x, cellRect.y, table.getWidth(), dyOffset); 
      } 
     } 
    } 
     
    class DragDropRowMouseInputHandler extends MouseInputHandler { 
     
        public void mousePressed(MouseEvent e) {      //鼠标按下获得起点位置 
         super.mousePressed(e); 
         startDragPoint = (int)e.getPoint().getY(); 
        } 
         
        public void mouseDragged(MouseEvent e) {    //拖拽选中的行,稍微难点就在鼠标拖拽这一事件里面 
         int fromRow = table.getSelectedRow(); 
         
         if (fromRow >= 0) { 
          draggingRow = true; 
                   
          int rowHeight = table.getRowHeight();                                                          //获得行的高度 
           
          //中间的选中的某行 
          int middleOfSelectedRow = (rowHeight * fromRow) + (rowHeight / 2);                   
          int toRow = -1; 
          int yMousePoint = (int)e.getPoint().getY(); 
                   
          if (yMousePoint < (middleOfSelectedRow - rowHeight)) { 
           // Move row up 
           toRow = fromRow - 1; 
          } else if (yMousePoint > (middleOfSelectedRow + rowHeight)) { 
           // Move row down 
           toRow = fromRow + 1; 
          } 
           
          //数据调换 
          if (toRow >= 0 && toRow < table.getRowCount()) { 
           TableModel model = table.getModel(); 
           
        for (int i = 0; i < model.getColumnCount(); i++) { 
         Object fromValue = model.getValueAt(fromRow, i); 
         Object toValue = model.getValueAt(toRow, i); 
         
         model.setValueAt(toValue, fromRow, i); 
         model.setValueAt(fromValue, toRow, i); 
        } 
        table.setRowSelectionInterval(toRow, toRow); 
        startDragPoint = yMousePoint; 
          } 
           
          dyOffset = (startDragPoint - yMousePoint) * -1; 
          table.repaint(); 
         } 
        } 
         
        public void mouseReleased(MouseEvent e){ 
         super.mouseReleased(e); 
         draggingRow = false; 
         table.repaint();   //对表格的重新刷新。。。 
        } 
    } 
}     


******************************************************************************************
这个类实现对JTable的表格的行拖动,能达到想列拖动的效果,要用的话可以直接拿过去用
只要设置的个JTable就可以了(JTable.setUI(new DragDropRowTableUI ()));
这样就可以不用管JTable了,表格就具有行拖动的效果了。。。
2
0
分享到:
评论
3 楼 dream_1086 2012-12-13  
谢谢分享!
2 楼 zmx198768 2009-10-28  
http://www.velocityreviews.com/forums/t147778-jtable-drag-and-drop-a-row.html

原文在这。
1 楼 bevis.cn 2009-10-13  
终于开始了javaeye blog了呀,good

相关推荐

    c# datagridview 行拖拽

    下面我们将根据给定的部分内容逐步解析实现行拖拽的关键步骤: 1. **初始化 DataGridView** 首先,我们需要初始化 `DataGridView` 控件,并设置其数据源。这部分代码如下所示: ```csharp public partial ...

    JTable实现行间拖拽的最简单方法

    为了实现行拖放,我们需要关注`TableModel`,因为它是数据源。 添加行拖放功能的核心在于监听`MouseMotionListener`和`MouseListener`。首先,我们创建一个`JTable`的子类,然后添加这两个监听器。在监听器中,我们...

    Ext.net实现GridPanel拖动行、上移下移排序功能DEMO

    对于GridPanel中拖动选中行排序的实现,网上有不少ExtJs实现的例子,但是没有找到使用Ext.net实现的,正好最近有个需求要使用,干脆来写一个。 DEMO功能说明: 1、拖动GridPanel选中行到新位置排序。 2、在拖动结束...

    c#.net datagridview内部行拖动,也就是拖动交换行

    为了实现行拖动功能,你需要在`dgv行行拖动.cs`文件中编写处理`MouseDown`、`MouseMove`和`MouseUp`事件的代码。同时,需要考虑一些细节,比如处理多选行的情况,以及在拖动过程中保持数据的同步。 5. **优化用户...

    WPF DataGrid 行拖拽

    实现行拖放功能时,我们主要关注以下几点: 1. **事件监听**:我们需要监听鼠标事件,如MouseDown、MouseMove和MouseUp,以检测用户是否开始拖动行。在MouseDown事件中,记录下被点击的行,同时开启MouseMove事件...

    实现table表格可按行拖拽,按列排序,并可以保存排序后的结果

    "实现table表格可按行拖拽,按列排序,并可以保存排序后的结果"是一个常见的需求,尤其适用于数据展示和管理的场景。这里我们将详细探讨如何利用jQuery、jQuery.tablesorter和jQuery.tablednd_0_5这三个JavaScript库...

    C# WPF DataGrid行拖拽顺序交换

    在开发过程中,有时我们需要实现一个功能,即允许用户通过拖拽行来改变DataGrid中数据的显示顺序。这个功能在处理可排序列表时非常实用,比如在管理任务列表、产品目录或任何需要用户自定义顺序的数据集合时。标题...

    QT实现可拖拽排序的表格

    本文将深入探讨如何利用QT库来实现这一功能,并结合描述中的"QT实现可拖拽行排序的表格"进行详细讲解。 首先,QT是一个跨平台的应用程序开发框架,它提供了一系列丰富的图形用户界面(GUI)工具包,使得开发者能够...

    实现GridView的拖拽

    在许多应用中,为了提供更好的用户体验,我们可能需要实现GridView的动态交互功能,如拖拽排序。本教程将详细介绍如何通过自定义GridView实现左右拖拽以及点击事件。 首先,我们需要创建一个自定义的GridView类,...

    Java实现拖拽列表项的排序功能

    们需要在后端处理拖拽事件,...理解这些原理后,无论是JavaFX还是Swing,甚至是其他平台的UI框架,都能灵活地实现拖拽排序功能。通过这个功能,我们可以提高用户的交互体验,让他们能更直观、便捷地调整列表项的顺序。

    vue Element ui实现table列拖动效果

    为了实现拖动功能,我们需要在拖动开始、拖动中以及拖动结束时分别进行处理: 1. **拖动开始**:当用户开始拖动列头时,记录当前被拖动列的位置和鼠标起始位置。Vue 提供了事件修饰符 `.stop` 和 `.prevent` 可以...

    jquery实现table拖拽列效果

    用jquery实现table拖拽列功能,可动态改变表格列宽度,并且实现table表格100%的问题,如果列缩小,则自动拉伸最后一列以实现table100%的效果,如果拉伸长度比原长度大,则显示x滚动条。

    Qt控件QListWidget实现鼠标拖拽Item换序

    在Windows平台上进行Qt界面开发时,常常需要实现用户交互丰富的功能,例如允许用户通过鼠标拖拽来调整列表中项目的顺序。QListWidget是Qt库中一个常用的控件,用于显示可单选或多选的列表项。本篇将详细介绍如何在...

    delphi cxgrid 拖放移动记录 交换行记录

    cxgrid 拖放移动记录,cxgrid 拖放,cxgrid 拖动记录,cxgrid 鼠标拖动记录 这是cxgrid开发公司回复客户时所发送的源码项目,用于实现鼠标拖动记录,改变记录在表格中的位置,所以直接编译运行,供大家借鉴

    EasyUI 行拖动效果

    页面中会包含一个DataGrid的实例,并且已经配置好了行拖动的相关设置,用户可以通过查看和修改这个HTML文件来了解和学习如何在自己的项目中实现行拖动。 具体实现步骤可能包括以下几个部分: 1. 引入EasyUI和`...

    WPF DataGrid 拖拽实现

    注意,为了使拖放操作流畅,你可能还需要处理其他一些细节,比如禁用默认的选中行行为,以及处理嵌套DataGrid或其他复杂情况。同时,确保在不同操作系统和鼠标设备上都能正常工作。 通过以上步骤,你可以在WPF的...

    基于Vue实现可以拖拽的树形表格

    在Vue.js框架中实现一个可拖拽的树形表格是一项技术挑战,涉及到组件设计、事件处理、数据管理和DOM操作等多个方面。Vue.js以其简洁的API和强大的响应式系统深受开发者喜爱,而添加拖拽功能则需要用到HTML5的Drag ...

    JQuery实现的GridView行拖拽例子

    在这个"JQuery实现的GridView行拖拽例子"中,我们将深入探讨如何利用jQuery来实现GridView控件中行的拖放功能,这是一种增强用户交互性和界面动态性的常见方法。 首先,GridView是ASP.NET中用于显示数据的一种Web...

    c# 实现任意控件的拖拽

    下面将详细介绍如何在C#中实现任意控件的拖拽功能。 首先,我们需要为控件添加鼠标事件处理程序。在C#中,这些事件包括`MouseDown`、`MouseMove`和`MouseUp`。`MouseDown`事件在鼠标按钮被按下时触发,`MouseMove`...

    网页制作中如何实现拖拽

    在网页制作中,实现拖拽功能可以极大地提升用户体验,使得用户能够自由地调整页面元素的位置,从而创建个性化的布局。这种交互方式常见于各种网页编辑器、在线设计工具以及一些可自定义布局的应用中。本文将详细讲解...

Global site tag (gtag.js) - Google Analytics