0 0

JTable整行拖动 3

1. 当我选中JTabel的某一行时,拖动这个行的时候,整行数据都一起拖动,随便都可以拖到某一行中间。
2. 还有就是,几行一起拖动,当我给定一范围,假定是3行,以选中某一行为起始点,一行为结束点,这几行能整个拖动。。。
怎么实现呢?
2009年6月23日 22:43

4个答案 按时间排序 按投票排序

0 0

这是一个行拖拽的实例,非常好,你看看

package com.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableFrame extends JFrame {
	public TableFrame(){
		setLayout(new BorderLayout());
		DefaultTableModel dm = new DefaultTableModel(new String[]{"index","content"}, 0){

			@Override
			public Object getValueAt(int row, int column) {
				if(column==0){
					return row;
				}
				return super.getValueAt(row, column);
			}
			
		};
		final JTable table=new JTable(dm);
		table.setUI(new DragDropRowTableUI());
		for(int i=0;i<10;i++){
			dm.addRow(new Object[]{i,i+"string"});
		}
		add(new JScrollPane(table),BorderLayout.CENTER);
		JButton btn=new JButton("hello");
		btn.addActionListener(new ActionListener() {
			
			
			public void actionPerformed(ActionEvent e) {
				System.out.println(table.getSelectedRow());;
				System.out.println(table.getValueAt(4, 1));
			}
		});
		add(btn,BorderLayout.SOUTH);
		this.setSize(600,400);
		setVisible(true);
	}
	public static void main(String[] args) {
		new TableFrame();
	}
}

package com.test;
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;
                        System.out.println("dyOffset:" + dyOffset);
          table.repaint();
         }
        }
        
        public void mouseReleased(MouseEvent e){
         super.mouseReleased(e);
         draggingRow = false;
         table.repaint();
        }
    }
}

2014年7月04日 11:54
0 0

朋友,问题要自动关闭啦,结分哦

2009年7月08日 18:53
0 0

怎么都没有人来回答下叻== @@"
我想是可以通过鼠标事件来实现的,MousePressed()选中行数,MouseDrag()拖动行(在这里具体写,一时半会儿也迷惑着。。。),MouseReless() :确定行落下的位置是移动在哪一行插入,后面两个事件里面的逻辑怎么处理,需要各位大虾们指点一下哈。。 谢谢!

2009年7月03日 10:09
0 0

JTable允许拖拽,但是也仅仅是允许列拖动,行拖动的话,好像没有原生的支持,要实现这种功能的话,lz需要自己写代码了。可以参照J2SE-tutorial里面的《Trail: Drag and Drop》章节。

2009年6月24日 14:50

相关推荐

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

    本文将详细介绍如何通过一种简单的方法,为`JTable`添加行间拖拽功能,而无需对已有代码进行大规模修改或实现复杂的DnD接口。 首先,理解`JTable`的基本结构是至关重要的。`JTable`由`TableModel`、`...

    JTable 拖动行 移动行

    JTable 拖动行 移动行的ui,直接 table.setUI(new DragDropRowTableUI()); 调用

    JTable 操作单元格 行 列

    在Java Swing库中,`JTable`是一个非常重要的组件,用于在GUI应用程序中展示二维数据。它是基于模型-视图-控制器(MVC)架构设计的,使得数据操作变得灵活且易于管理。本篇文章将深入探讨`JTable`如何操作单元格、行...

    JTable 拖动行 移动行JTable 拖动行 移动行的ui

    在标题和描述中提到的“JTable 拖动行 移动行的ui”,正是指为`JTable`添加了拖放功能的用户界面。 要实现这个功能,通常我们需要自定义`JTable`的UI,或者使用已经存在的第三方库。在描述中提到了`table.setUI(new...

    JTable 拖动行 移动行JTable 拖动行 移动行的ui,

    在Java Swing库中,`JTable`是一个非常重要的组件,用于展示二维数据表格。当我们需要在用户界面上实现拖放功能,允许用户通过鼠标拖动来改变行的顺序时,可以利用自定义的表UI(Table UI)实现这一功能。在给定的...

    JTable 拖动行 移动行JTable 拖动行 移动行的ui,直接 table.setUI(

    标题和描述提到的`DragDropRowTableUI`是`JTable`的一种自定义用户界面(UI)实现,它扩展了`javax.swing.plaf.basic.BasicTableUI`,增加了拖放功能,使得用户可以直接通过鼠标拖动来移动`JTable`的行。 要实现`...

    java swing 表头不可拖动

    在标题"java swing 表头不可拖动"中,提到的问题是关于如何在Java Swing应用中阻止JTable的列头进行拖动操作。这通常是通过自定义JTable或其相关的HeaderView来实现的。在Swing中,JTable的表头(表头即列头)是由...

    JTable使用 JTable使用

    JTable使用 JTable使用JTable使用JTable使用

    JTable动态刷新数据

    JTable 动态刷新数据 JTable 动态刷新数据是指在 Java Swing 应用程序中,使用 JTable 组件展示数据,并实时更新数据的过程。这种技术在很多实际应用场景中非常有用,如股票交易平台、实时监控系统、电子表格等。 ...

    java 中 Jtable的用法

    ### Java中的JTable用法详解 #### 一、概述 JTable是Swing框架中用于显示和编辑表格数据的关键组件之一。它不仅提供了强大的数据管理功能,还支持丰富的定制选项,使得开发者能够根据具体需求创建出高度个性化的...

    jTree和jTable 双向联动

    实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。

    JTable

    JTable的显示效果

    JTable 练习例子exa

    在Java Swing库中,`JTable`是一个非常重要的组件,用于在GUI应用程序中展示表格数据。它是`javax.swing.JTable`类的实例,提供了一个可交互的二维数据视图,允许用户浏览、编辑和操作表格中的数据。这个"JTable ...

    JTable颜色渲染代码

    - **列选择允许**:`table.setColumnSelectionAllowed(true)`表示允许用户只选中一列而不选中整行。 - **自动调整大小模式关闭**:`table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)`表示关闭表格自动调整列宽的...

    JTable自动换行

    在Java的Swing库中,`JTable`是用于创建二维数据展示的组件,它类似于电子表格。在处理`JTable`时,我们有时需要使其单元格内容支持自动换行,以便更好地显示长文本。标题“JTable自动换行”正是指向这个功能,即...

    JTable的使用收藏

    JTable的使用收藏 1.JTable与TableModel 1.TableModel与JTable的关系 2.TableModel实践 3.使用JTable+TableModel展示java中的数据对象 2.JTable展示方式的美化 1.设置表格的宽度和高度 2.要显示表头 3.新加列,将...

    Jtable中加入复选框的两种方法

    JTable中加入复选框的两种方法 在Java中,JTable是一个常用的表格控件,用于显示和编辑表格数据。然而,在JTable中加入复选框是一个常见的需求,但是却不是那么容易实现。本文将介绍JTable中加入复选框的两种方法,...

    JTable的初步编程

    打开NetBeans,创建一个新的Java Swing GUI应用,然后从工具箱中拖拽`JTable`到设计视图。接着,你可以右键点击`JTable`并选择“调整列宽”、“添加列”等操作。对于数据模型,NetBeans会自动为你创建一个`...

    JTable添加CheckBox

    在Java Swing中,`JTable` 是用于展示二维数据的组件,它允许用户查看和编辑数据。本示例探讨如何在`JTable`中添加`CheckBox`,并实现表头的`JCheckBox`全选联动功能。这在需要用户进行多选操作的界面中非常常见,...

    Jtable 中放入多个按钮

    在Java Swing库中,`JTable`是一个非常重要的组件,用于展示二维数据表格。当我们需要在`JTable`中实现更复杂的交互,比如在一个单元格内放置多个按钮时,这通常涉及到自定义`TableCellRenderer`和`TableCellEditor`...

Global site tag (gtag.js) - Google Analytics