现在一直都在弄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了,表格就具有行拖动的效果了。。。
分享到:
相关推荐
下面我们将根据给定的部分内容逐步解析实现行拖拽的关键步骤: 1. **初始化 DataGridView** 首先,我们需要初始化 `DataGridView` 控件,并设置其数据源。这部分代码如下所示: ```csharp public partial ...
为了实现行拖放,我们需要关注`TableModel`,因为它是数据源。 添加行拖放功能的核心在于监听`MouseMotionListener`和`MouseListener`。首先,我们创建一个`JTable`的子类,然后添加这两个监听器。在监听器中,我们...
对于GridPanel中拖动选中行排序的实现,网上有不少ExtJs实现的例子,但是没有找到使用Ext.net实现的,正好最近有个需求要使用,干脆来写一个。 DEMO功能说明: 1、拖动GridPanel选中行到新位置排序。 2、在拖动结束...
为了实现行拖动功能,你需要在`dgv行行拖动.cs`文件中编写处理`MouseDown`、`MouseMove`和`MouseUp`事件的代码。同时,需要考虑一些细节,比如处理多选行的情况,以及在拖动过程中保持数据的同步。 5. **优化用户...
实现行拖放功能时,我们主要关注以下几点: 1. **事件监听**:我们需要监听鼠标事件,如MouseDown、MouseMove和MouseUp,以检测用户是否开始拖动行。在MouseDown事件中,记录下被点击的行,同时开启MouseMove事件...
"实现table表格可按行拖拽,按列排序,并可以保存排序后的结果"是一个常见的需求,尤其适用于数据展示和管理的场景。这里我们将详细探讨如何利用jQuery、jQuery.tablesorter和jQuery.tablednd_0_5这三个JavaScript库...
在开发过程中,有时我们需要实现一个功能,即允许用户通过拖拽行来改变DataGrid中数据的显示顺序。这个功能在处理可排序列表时非常实用,比如在管理任务列表、产品目录或任何需要用户自定义顺序的数据集合时。标题...
本文将深入探讨如何利用QT库来实现这一功能,并结合描述中的"QT实现可拖拽行排序的表格"进行详细讲解。 首先,QT是一个跨平台的应用程序开发框架,它提供了一系列丰富的图形用户界面(GUI)工具包,使得开发者能够...
在许多应用中,为了提供更好的用户体验,我们可能需要实现GridView的动态交互功能,如拖拽排序。本教程将详细介绍如何通过自定义GridView实现左右拖拽以及点击事件。 首先,我们需要创建一个自定义的GridView类,...
们需要在后端处理拖拽事件,...理解这些原理后,无论是JavaFX还是Swing,甚至是其他平台的UI框架,都能灵活地实现拖拽排序功能。通过这个功能,我们可以提高用户的交互体验,让他们能更直观、便捷地调整列表项的顺序。
为了实现拖动功能,我们需要在拖动开始、拖动中以及拖动结束时分别进行处理: 1. **拖动开始**:当用户开始拖动列头时,记录当前被拖动列的位置和鼠标起始位置。Vue 提供了事件修饰符 `.stop` 和 `.prevent` 可以...
用jquery实现table拖拽列功能,可动态改变表格列宽度,并且实现table表格100%的问题,如果列缩小,则自动拉伸最后一列以实现table100%的效果,如果拉伸长度比原长度大,则显示x滚动条。
在Windows平台上进行Qt界面开发时,常常需要实现用户交互丰富的功能,例如允许用户通过鼠标拖拽来调整列表中项目的顺序。QListWidget是Qt库中一个常用的控件,用于显示可单选或多选的列表项。本篇将详细介绍如何在...
cxgrid 拖放移动记录,cxgrid 拖放,cxgrid 拖动记录,cxgrid 鼠标拖动记录 这是cxgrid开发公司回复客户时所发送的源码项目,用于实现鼠标拖动记录,改变记录在表格中的位置,所以直接编译运行,供大家借鉴
页面中会包含一个DataGrid的实例,并且已经配置好了行拖动的相关设置,用户可以通过查看和修改这个HTML文件来了解和学习如何在自己的项目中实现行拖动。 具体实现步骤可能包括以下几个部分: 1. 引入EasyUI和`...
注意,为了使拖放操作流畅,你可能还需要处理其他一些细节,比如禁用默认的选中行行为,以及处理嵌套DataGrid或其他复杂情况。同时,确保在不同操作系统和鼠标设备上都能正常工作。 通过以上步骤,你可以在WPF的...
在Vue.js框架中实现一个可拖拽的树形表格是一项技术挑战,涉及到组件设计、事件处理、数据管理和DOM操作等多个方面。Vue.js以其简洁的API和强大的响应式系统深受开发者喜爱,而添加拖拽功能则需要用到HTML5的Drag ...
在这个"JQuery实现的GridView行拖拽例子"中,我们将深入探讨如何利用jQuery来实现GridView控件中行的拖放功能,这是一种增强用户交互性和界面动态性的常见方法。 首先,GridView是ASP.NET中用于显示数据的一种Web...
下面将详细介绍如何在C#中实现任意控件的拖拽功能。 首先,我们需要为控件添加鼠标事件处理程序。在C#中,这些事件包括`MouseDown`、`MouseMove`和`MouseUp`。`MouseDown`事件在鼠标按钮被按下时触发,`MouseMove`...
在网页制作中,实现拖拽功能可以极大地提升用户体验,使得用户能够自由地调整页面元素的位置,从而创建个性化的布局。这种交互方式常见于各种网页编辑器、在线设计工具以及一些可自定义布局的应用中。本文将详细讲解...