`

配合滚动面板实现JTable上下翻页的效果

阅读更多
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

@SuppressWarnings("serial")
public class PagingTester extends JFrame {

	public PagingTester() {
		super("Paged JTable Test");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		PagingModel pm = new PagingModel();
		JTable jt = new JTable(pm);
		// Use our own custom scrollpane.
		JScrollPane jsp = PagingModel.createPagingScrollPaneForTable(jt);
		getContentPane().add(jsp, BorderLayout.CENTER);
		setVisible(true);
	}

	public static void main(String args[]) {
		PagingTester pt = new PagingTester();
		pt.setVisible(true);
	}
}

//PagingModel.java
//A larger table model that performs "paging" of its data. This model
//reports a small number of rows (like 100 or so) as a "page" of data. You
//can switch pages to view all of the rows as needed using the pageDown()
//and pageUp() methods. Presumably, access to the other pages of data is
//dictated by other GUI elements such as up/down buttons, or maybe a text
//field that allows you to enter the page number you want to display.
//

@SuppressWarnings("serial")
class PagingModel extends AbstractTableModel {

	protected int pageSize;

	protected int pageOffset;

	protected Record[] data;

	public PagingModel() {
		this(105, 100);
	}

	public PagingModel(int numRows, int size) {
		data = new Record[numRows];
		pageSize = size;

		// Fill our table with random data (from the Record() constructor).
		for (int i = 0; i < data.length; i++) {
			data[i] = new Record();
		}
	}

	// Return values appropriate for the visible table part.
	public int getRowCount() {
		int count = data.length;
		if (pageOffset == getPageCount() - 1) {
			count = data.length - pageOffset * pageSize;
		}
		return Math.min(pageSize, count);
	}

	public int getColumnCount() {
		return Record.getColumnCount();
	}

	// Work only on the visible part of the table.
	public Object getValueAt(int row, int col) {
		int realRow = row + (pageOffset * pageSize);
		return data[realRow].getValueAt(col);
	}

	public String getColumnName(int col) {
		return Record.getColumnName(col);
	}

	// Use this method to figure out which page you are on.
	public int getPageOffset() {
		return pageOffset;
	}

	public int getPageCount() {
		return (int) Math.ceil((double) data.length / pageSize);
	}

	// Use this method if you want to know how big the real table is . . . we
	// could also write "getRealValueAt()" if needed.
	public int getRealRowCount() {
		return data.length;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int s) {
		if (s == pageSize) {
			return;
		}
		int oldPageSize = pageSize;
		pageSize = s;
		pageOffset = (oldPageSize * pageOffset) / pageSize;
		fireTableDataChanged();
		/*
		 * if (pageSize < oldPageSize) { fireTableRowsDeleted(pageSize, oldPageSize - 1); } else { fireTableRowsInserted(oldPageSize, pageSize - 1); }
		 */
	}

	// Update the page offset and fire a data changed (all rows).
	public void pageDown() {
		if (pageOffset < getPageCount() - 1) {
			pageOffset++;
			fireTableDataChanged();
		}
	}

	// Update the page offset and fire a data changed (all rows).
	public void pageUp() {
		if (pageOffset > 0) {
			pageOffset--;
			fireTableDataChanged();
		}
	}

	// We provide our own version of a scrollpane that includes
	// the page up and page down buttons by default.
	public static JScrollPane createPagingScrollPaneForTable(JTable jt) {
		JScrollPane jsp = new JScrollPane(jt);
		TableModel tmodel = jt.getModel();

		// Don't choke if this is called on a regular table . . .
		if (!(tmodel instanceof PagingModel)) {
			return jsp;
		}

		// Okay, go ahead and build the real scrollpane
		final PagingModel model = (PagingModel) tmodel;
		final JButton upButton = new JButton(new ArrowIcon(ArrowIcon.UP));
		upButton.setEnabled(false); // starts off at 0, so can't go up
		final JButton downButton = new JButton(new ArrowIcon(ArrowIcon.DOWN));
		if (model.getPageCount() <= 1) {
			downButton.setEnabled(false); // One page...can't scroll down
		}

		upButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				model.pageUp();

				// If we hit the top of the data, disable the up button.
				if (model.getPageOffset() == 0) {
					upButton.setEnabled(false);
				}
				downButton.setEnabled(true);
			}
		});

		downButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				model.pageDown();

				// If we hit the bottom of the data, disable the down button.
				if (model.getPageOffset() == (model.getPageCount() - 1)) {
					downButton.setEnabled(false);
				}
				upButton.setEnabled(true);
			}
		});

		// Turn on the scrollbars; otherwise we won't get our corners.
		jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

		// Add in the corners (page up/down).
		jsp.setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, upButton);
		jsp.setCorner(ScrollPaneConstants.LOWER_RIGHT_CORNER, downButton);

		return jsp;
	}
}

//Record.java
//A simple data structure for use with the PagingModel demo.
//

class Record {
	static String[] headers = { "Record Number", "Batch Number", "Reserved" };

	static int counter;

	String[] data;

	public Record() {
		data = new String[] { "" + (counter++), "" + System.currentTimeMillis(), "Reserved" };
	}

	public String getValueAt(int i) {
		return data[i];
	}

	public static String getColumnName(int i) {
		return headers[i];
	}

	public static int getColumnCount() {
		return headers.length;
	}
}

//ArrowIcon.java
//A simple implementation of the Icon interface that can make
//Up and Down arrows.
//

class ArrowIcon implements Icon {

	public static final int UP = 0;

	public static final int DOWN = 1;

	private int direction;

	private Polygon pagePolygon = new Polygon(new int[] { 2, 4, 4, 10, 10, 2 }, new int[] { 4, 4, 2, 2, 12, 12 }, 6);

	private int[] arrowX = { 4, 9, 6 };

	private Polygon arrowUpPolygon = new Polygon(arrowX, new int[] { 10, 10, 4 }, 3);

	private Polygon arrowDownPolygon = new Polygon(arrowX, new int[] { 6, 6, 11 }, 3);

	public ArrowIcon(int which) {
		direction = which;
	}

	public int getIconWidth() {
		return 14;
	}

	public int getIconHeight() {
		return 14;
	}

	public void paintIcon(Component c, Graphics g, int x, int y) {
		g.setColor(Color.black);
		pagePolygon.translate(x, y);
		g.drawPolygon(pagePolygon);
		pagePolygon.translate(-x, -y);
		if (direction == UP) {
			arrowUpPolygon.translate(x, y);
			g.fillPolygon(arrowUpPolygon);
			arrowUpPolygon.translate(-x, -y);
		} else {
			arrowDownPolygon.translate(x, y);
			g.fillPolygon(arrowDownPolygon);
			arrowDownPolygon.translate(-x, -y);
		}
	}
}

 

  • 大小: 66.4 KB
分享到:
评论

相关推荐

    Swing下滚动条实现仿分页

    在“仿分页”实现中,JTable可能被用来显示数据集的一个“页面”,当用户滚动滚动条时,JTable会显示数据集的下一“页面”。 JScrollPane是Swing提供的一种容器,它能够添加一个可滚动的视图,如JTable。...

    netbeans jtable 复杂表头的实现方法

    - 从工具箱中拖拽`JTable`到设计面板。 - 右键点击表头,选择“属性”以编辑表头设置。 - 在代码视图中,添加自定义渲染器的逻辑。 通过以上步骤,你可以使用NetBeans IDE创建一个具有复杂表头的`JTable`。不过...

    Java Swing实现JTable检测单元格数据变更事件的方法示例

    Java Swing 实现 JTable 检测单元格数据变更事件的方法示例 Java Swing 中的 JTable 是一个功能强大且灵活的表格组件,广泛应用于各种桌面应用程序中。然而,在实际开发中,我们经常需要检测单元格数据的变更事件...

    JTable(还分页面板示例)

    同时,为了实现分页效果,可能还会涉及到动态添加、移除或更新`TabbedPane`上的面板。 最后,`DataTable.java`可能是用于处理实际数据的类,它可能包含了获取数据、计算页数、分页逻辑等功能。在这个类中,可能会有...

    JTable

    JTable的显示效果

    实现JTable 数据的添加删除

    下面将详细介绍如何实现`JTable`数据的添加与删除。 ### 一、`JTable`的基本结构 `JTable`通常由三部分组成:`TableModel`、`ColumnModel`和`View`。`TableModel`是数据的来源,存储实际的表格数据;`ColumnModel`...

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

    通过这样的方式,我们实现了`JTable`行间的拖放功能,而且无需实现DnD接口,简化了实现过程。这使得在已有的`JTable`应用中添加此功能变得更加便捷。在实际开发中,你可能还需要处理一些边缘情况,比如拖动到表头或...

    JAVA JTable使用实例

    `JTable`通常与`JScrollPane`一起使用,以便在数据过多时提供滚动功能。在这个“JAVA JTable使用实例”中,我们将深入探讨如何有效地利用`JTable`来显示和操作数据。 首先,`JTable`是`javax.swing.JTable`类的实例...

    jTree和jTable 双向联动

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

    JTable使用 JTable使用

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

    JTable 拖动行 移动行

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

    JTable 练习例子exa

    此外,`Table_01`可能还包含如何将`JTable`添加到`JScrollPane`以实现滚动功能,以及如何在`JFrame`或`JPanel`上布置整个组件。 在实际使用中,`JTable`提供了丰富的功能,如排序、选择、编辑单元格等。可以通过...

    JTable的介绍.doc

    开发者可以根据需要自定义`TableModel`来适应不同的数据结构,或者通过监听`JTable`的各种事件来实现特定的功能,如单元格更改、行选择等。`JTable`是Java Swing中非常重要的组件,广泛应用于数据展示和用户交互场景...

    基于java的学籍管理系统.实现了JTable控件的封装

    基于java的学籍管理系统.实现了JTable控件的封装.-.rar基于java的学籍管理系统.实现了JTable控件的封装.-.rar基于java的学籍管理系统.实现了JTable控件的封装.-.rar

    JTable动态刷新数据

    在使用 JTable 时,需要注意表格的列宽和行高的设定,这可以使用 TableColumn 的 setMaxWidth() 和 setMinWidth() 方法来实现。 JTable 动态刷新数据需要使用 DefaultTableModel 来存储和管理数据,然后使用...

    swing Jtable使用checkbox

    swing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing Jtable使用checkboxswing ...

    学会用JScrollPane和Jtable以及table的Defaulttablemodel*

    `JScrollPane`是一个可以滚动的面板,当表格内容较多时,使用`JScrollPane`可以实现滚动浏览的功能,避免窗口过大导致布局不合理。 #### 三、具体实现步骤 ##### 步骤1:创建基础框架 首先创建一个继承自`JFrame`...

    实现了超链接功能的JTable

    实现了超链接功能的JTable,双击后ie打开超链接,超链接文字为蓝色,同时屏蔽了单元格的双击编辑功能,很实用.

    JTable的使用收藏

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

    JTable颜色渲染代码

    - `TableScrollPane`:是一个`JScrollPane`对象,用于容纳JTable,并提供滚动条功能。 - `tableData` 和 `tableHeader`:分别为表格的数据和列头信息存储容器。 #### 数据准备 - `Object[][] data`:一个二维数组...

Global site tag (gtag.js) - Google Analytics