可拖拽表格的swing实现(通过拖拽表格的行,实现交换行位置的交换)
来源:互联网 发布:java运维和开发哪个好 编辑:程序博客网 时间:2024/05/17 20:29
swing里的table可以通过setUI(? extends BasicTableUI )这个方法来实现对表的外观的一些控制,如下代码实现了简单的例子:
1.测试类:
import java.awt.Dimension;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JScrollPane;public class DragTableTest extends JFrame {/** * table拖拽交换数据样例 */private static final long serialVersionUID = 1L;private DragTable table= null;String [] header = {"ID","name","score"};Object [][] data = {{1,"贾巴尔",38387},{2,"马龙",36928},{3,"kobe",32331},{4,"jordan",32292},{5,"张伯伦",31419}};public DragTableTest () {initView();setLocalCenter();}public static void main(String[] args) {DragTableTest tst = new DragTableTest();tst.setVisible(true);}private void initView (){this.setSize(new Dimension(400,400));this.setTitle("可拖拽换行table:");JScrollPane pan = new JScrollPane(getTable());this.getContentPane().add(pan);this.setDefaultCloseOperation(EXIT_ON_CLOSE);}private DragTable getTable(){if(table == null){table = new DragTable();table.setModel(new DragTableModel(data,header));table.setUI(new DragDropRowTableUI());}return table;}/** * 界面居中 */private void setLocalCenter(){Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();int screenWidth = screenSize.width;int screenHight = screenSize.height;this.setLocation((screenWidth - this.getWidth()) / 2,(screenHight - this.getHeight()) / 2);}}2.在这里自定义的tableUI如下: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 { /** * @author zhen.p */ private boolean draggingRow = false; private int startDragPoint; private int dyOffset; TableModel model=null; 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 uptoRow = fromRow - 1;} else if (yMousePoint > (middleOfSelectedRow + rowHeight)) {// Move row downtoRow = fromRow + 1;}if (toRow >= 0 && toRow < table.getRowCount()) {model = table.getModel();if(model instanceof DragTableModel) {
//用于交换tableModel中数据的顺序,以供拖拽至后数据交换位置显示Object[][] data = ((DragTableModel) model).getData();Object[][] listresult = swapObjectList(data, fromRow, toRow);((DragTableModel) model).setData(listresult);}table.setRowSelectionInterval(toRow, toRow);startDragPoint = yMousePoint;}dyOffset = (startDragPoint - yMousePoint) * -1;table.repaint();}} public void mouseReleased(MouseEvent e){ super.mouseReleased(e); draggingRow = false; table.repaint(); } } private Object[][] swapObjectList( Object[][] origin,int fromRow,int toRow ){ Object [] mid = new Object [origin[0].length]; mid = origin[fromRow]; origin[fromRow] = origin[toRow]; origin[toRow] = mid ;return origin; }}3.自定义的table:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JTable;public class DragTable extends JTable implements ActionListener{/*** table*/private static final long serialVersionUID = 1L;public DragTable () {}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub}}4.自定义的tablemodel:import javax.swing.table.AbstractTableModel;public class DragTableModel extends AbstractTableModel{/*** table model*/private static final long serialVersionUID = 1L;private Object[][] data = null;public Object[][] getData() {return data;}public void setData(Object[][] data) {this.data = data;}private String [] header = null;public DragTableModel (Object[][] data ,String [] header){this.data = data;this.header = header;}public int getRowCount() {return data.length;}@Overridepublic int getColumnCount() {return header.length;}@Overridepublic String getColumnName(int column) {return header[column];}@Overridepublic Object getValueAt(int row, int column) {if(row >= 0){switch(column){ case 0: return data[row][0]; case 1: return data[row][1];case 2: return data[row][2]; }}return null;}}
0 0
- 可拖拽表格的swing实现(通过拖拽表格的行,实现交换行位置的交换)
- javascript中对表格的操作:创建表格 删除行 删除列 交换行 交换列
- javascript实现动态表格的换行变色
- QTableWidget中实现表格的自动换行
- 论swing的表格
- 表格的自动换行
- XSL中实现HTML的表格自动换行
- XSL中实现HTML的表格自动换行
- 如何实现表格中文字的强制换行
- CSS中如何实现表格文字的换行
- ExtJs 表格的实现
- 表格控件的实现
- 表格排序的实现
- easyui表格的实现
- 细表格的实现
- 通过javascript实现动态添加删除表格的行
- 表格列的位置拖拽
- c#通过Word实现打印的代码(表格为例)
- 关于DM9000A驱动的问题和解决
- 字符串
- wireless常用缩写词
- 『ANDROID』Android之drawable state各个属性详解
- java自学日记三
- 可拖拽表格的swing实现(通过拖拽表格的行,实现交换行位置的交换)
- NET STOP MSSQLSERVER 通过SQL Server命令行启动及停止SQL服务的方法
- Java中泛型选择排序(升序),继承Comparable接口
- twemproxy redis ttserver phpadmin memcache
- ACRush 楼天成回忆录 (与所有ACMer共勉!!)
- 参加了华为奖学金答辩,哎。。。太紧张了,估计没多少希望了
- 怎样为内核打补丁
- C++状态模式的用法
- Java 类.this含义与.new