java treetable_在Swing中创建TreeTable | 学步园

TreeTable是Tree和Table的一个结合-

就是一个即能够展开和收起行,同时也能够显示多个列的组件。在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtree做成Jtable的渲染器来创建一个这样的组件。

这篇文章就是关于如何使用该技术来创建一个TreeTable。最后实现一个名为TreeTableExample0的例子程序,该例子实现了一个TreeTable的浏览器,可以用来浏览本机的文件系统(如下图所示)

1350021723_4385.gif

在Swing中,Jtree,Jtable,Jlist和JcomboBox组件都是使用一个叫做单元格渲染器(Cell Render)的指定对象来画内容。单元格渲染器的paint()方法来画list中的每一项,tree中的每个节点,table中的每个单元格。单元格渲染器就象一个“印章(rubber

stamp)”,它会移动到setBounds()方法指定的位置,然后用paint()方法来画。

通过使用组件来渲染单元格,你可以仅创建一个组件来高效地显示大量的相同组件。缺省的,Swing组件使用支持简单的文本和图标组合(Text和Icon)的Jlabel来做单元格的渲染器。要使用任何的Swing组件做单元格渲染器,只需创建一个实现了相应的单元格渲染器接口的子类。如:Jtable的TableCellRenderer接口,Jlist的ListCellRenderer接口,等等。

Swing中的渲染

下面是一个如何在JTable中使用JcheckBox作为渲染器的例子

public class CheckBoxRenderer extends JCheckBox

implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table,

Object value, boolean isSelected,

boolean hasFocus, int row, int column) {

setSelected(((Boolean)value).booleanValue()));

return this;

}

}

来看看下面例子是如何工作的

下面的代码段是本文后面介绍的例子中的一个片断 ,演示了如何用JTree来渲染JTable的内部。这个例子稍微有点儿不寻常,是因为它把JTree的每单个节点画到JTable的每单个单元格,而不是把整个树画到每个JTable的单元格

我们使用通常的方法开始:通过扩展Jtree类和实现TableCellRenderer接口把Jtree展开到单元格渲染器。为了实现一个单元格渲染器所需的行为,我们必须让我们的渲染器仅把树的节点画在一个特定的表单元格中。 实现这些的一个简单方法就是重写setBounds()方法和paint()方法,如下:

public class TreeTableCellRenderer extends JTree

implements TableCellRenderer {

protected int visibleRow;

public void setBounds(int x, int y, int w, int h) {

super.setBounds(x, 0, w, table.getHeight());

}

public void paint(Graphics g) {

g.translate(0, -visibleRow * getRowHeight());

super.paint(g);

}

public Component getTableCellRendererComponent(JTable table,

object value,

boolean isSelected,

boolean hasFocus,

int row, int column) {

visibleRow = row;

return this;

}

}

当每个单元格绘制好以后,JTable进行正常的渲染过程,设置其边界,请求绘制。然而在本例中,我们使用一个实例变量visibleRow来记录当前绘制的单元格的行号。同时我们重写了setBounds(),因此即使当JTable根据当前绘制的单元格的尺寸来设定自己的边界的时候,Jtree也能和JTable保持同意的高度。

为了完成该功能,我们还要重写paint(), 使用已经存储的变量visibleRow,把剪辑矩形区域移动到tree的相应部分的上方。结果是当table要求绘制的时候,Jtree 仅绘制它的其中一个节点。

除了把Jtree做成单元格第一列的渲染器,我们还把Jtree作为这些单元个的编辑器。这种作法的效果是JTable传递所有的鼠标和键盘事件给这个“编辑器” - 也就允许tree接受用户输入来展开和收缩它的节点。

例子:一个文件系统浏览器

文中的例子创建了一个文件系统浏览器,每个目录可以展开和收起,表中的其它列显示文件和目录的重要属性,如文件大小和日期等

下面是例子中的类文件列表,及其用途描述:

TreeTableModel.java: 新接口,扩展了TreeModel接口,描述TreeTable中要显示那些数据

AbstractTreeTableModel.java: TreeTableModel的基类,该类处理一些监听器。

TreeTableModelAdapter.java:  实现了TreeModel接口的包装类,输入参数为TreeTableModel和Jtree

AbstractCellEditor.java:  CellEditors的基类,该类处理一些监听器。

JTreeTable.java: JTable的子类,该类可以从TreeTableModel中渲染数据

MergeSort.java:  一个合并排序的实现

FileSystemModel.java: 本机文件系统的模型,AbstractTreeTableModel的实子类,实现了TreeTableModel接口

TreeTableExample0.java:

显示TreeTable的示例程序。

sources.zip:

包含上述文件的压缩文件,当你运行程序TreeTableExample0, 显示一个本地文件系统中文件和目录的TreeTable。就像文章开始部分显示的图片。 点击表的第一列中的支元素,项目就会象其它树一样的展开和收缩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬去微博十大流行语_用python重新定义【2019十大网络流行语】-后台/架构/数据库-敏捷大拇指-一个敢保留真话的IT精英社区...

↑关注 置顶 ~ 有趣的不像个技术号52568040f9313098ffa367d9d9d21437.jpg (5.73 KB, 下载次数: 0)2019-12-10 04:43 上传3f4d5fe0016d011a7a68af763314befd.jpg (1.06 KB, 下载次数: 0)2019-12-10 04:43 上传“文明互鉴真硬核,融梗柠檬谁觉得。霸凌第一九九六&…

java中怎么获取配置文件的值_java如何获取配置文件的值

转:原创 编码小王子 发布于2018-10-11 18:07:52 阅读数 2722 收藏展开java大型项目中都会很多系统常量,比如说数据库的账号和密码,以及各种token值等,都需要统一的管理,如果零落的散布到各个类等具体的代码中的话,在后期管理上将是一场灾难,所有需要对这些变量进行统…

python实现队列_用Python实现的数据结构与算法:队列

一、概述队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行。二、ADT队列ADT(抽象数据类型)一般提供以下接口:Queue() 创建队列enqueue(item) 向队尾插入项dequeue() 返回队首的项&#xf…

java 监听窗口是否改变_JAVA项目监听文件是否发生变化

一.spring容器都初始化完成之后做操作packagecom.bijian.study.listener;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.ApplicationListener;importorg.springframework.context.event.ContextRefreshedEvent;importorg.s…

笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()

如下所示:a,b,c,d input()很简单的代码,如果输入为1 -1 -2 3结果会报错,原因在于input函数会将你的输入作为python脚本运行,那么输入就变成了1-1 -2 3,即0 -2 3结果当然是错误的了,解决办法就是将输入用引…

java 数组写法_java书写、数据类型、数组定义

这里只记录java与php、javascript不同的地方,相同的地方就不赘述了。1.java文件源码为以.java为后缀的文件,字节码文件是以.class为后缀的文件。2.写好一个java源码之后,cmd进入源码文件盘符,用命令 javac helloworld.java将源码转…

python爬虫高级知识点_Python爬虫知识点梳理总结,殿堂级小白入门必读

数据分析是任何技术一样。你应该学习的目标。目标就像灯塔,指引你前进。我见过很多合作伙伴学习学习,然后学会放弃。事实上,很大一部分原因是没有明确的目标,所以你必须清楚学习的目的。你准备学习爬行之前,问问你自己为什么你想学爬行。有些人为了工作,一些为了好玩,和做一定黑…

java running_Running

/****/package test;import java.sql.ResultSet;import java.sql.SQLException;/*** author huangqin**/public class QuestString {private int curPage;//当前页数private int maxPage;//最大页数private int maxRowCount;//总记录数private int pageSize2;//每页显示的记录数…

python停用词表_多版本中文停用词词表 + 多版本英文停用词词表 + python词表合并程序...

文章简介与更新记录如果你只想获取中文停用词此表,请直接到文章结尾下载项目文件,其中包括三个中文停用词词表,一个英文停用词词表和一个合并词表的.py文件2017/07/04 创建文章,上传文件2017/07/04 更新了合并代码,添加了新的中文停用词表(哈工大扩展版本)和一个新的停用词表,现…

mysql collect_set_hive列转行 (collect_set())

一、问题hive如何将a b 1a b 2a b 3c d 4c d 5c d 6变为:a b 1,2,3c d 4,5,6二、数据test.txta b 1a b 2a b 3c d …

python编写递归函数和非递归函数、输出斐波那契数列_分别用非递归和递归的方法编写函数求斐波那契数列第n项。斐波那契数列1,1,2,3,5,8,13,…...

展开全部/**已知Fibonacci数列&#xff1a;1,1,2,3,5,8,……&#xff0c;F(1)1&#xff0c;F(2)1&#xff0c;F(n)F(n-1)F(n-2)*/#include #include typedef long long int int64;//方法1&#xff0c;递归法int64 Fibonacci(int n){int64 sum;if(n<0){printf("参数值e6…

python3.6安装ipython_centos6.5下安装python3.6、pip、ipython

一.先更换系统源为了下载顺畅一般都会更改为国内源。1 cd /etc/yum.repos.d/2 wget http://mirrors.163.com/.help/CentOS6-Base-163.repo #下载网易源3 mv CentOS-Base.repo CentOS-Base.repo.ori #备份源4 mv CentOS6-Base-163.repo CentOS-Base.repo #把网易源更改为默认源二…

java 多线程的同步问题_java多线程解决同步问题的几种方式,原理和代码

wait()/notify()方法await()/signal()方法BlockingQueue阻塞队列方法PipedInputStream/PipedOutputStream阻塞队列的一个简单实现&#xff1a;public class BlockingQueue {private List queue new LinkedList();private int limit 10;public BlockingQueue(int limit){this…

python期末大作业_大一期末考试很重要,考得好不仅有机会有钱拿,还有机会换专业...

现阶段很多高校放寒假的时间已经公布&#xff0c;这也就意味着&#xff0c;大学期末考试即将到来。对于大一新生来说&#xff0c;大学的期末考试是比较新鲜的&#xff0c;因为大家都没有经历过。经历过大学考试的学生&#xff0c;都知道大学的大概学习模式&#xff0c;一般情况…

java http 302重定向_Java 纯HTTP请求 禁止302自动重定向

Java 纯HTTP Get请求获取响应内容&#xff0c;如果发生302重定向&#xff0c;继而模拟请求域获取重定向后的响应内容。关键点&#xff1a;设置conn.setInstanceFollowRedirects为false即可示例代码public static void main(String[] args) {try {StringBuffer buffer new Stri…

python 且_Pyface库:一个基于pyqt、pyside、wx且简化的python的GUI

1 说明&#xff1a;1.1 Pyface库由大名鼎鼎的enthought出品。1.2 介绍&#xff1a;1.2.1 英文&#xff1a;traits-capable windowing framework.The pyface project contains a toolkit-independent GUI abstraction layer, which is used to support the "visualization&…

java方法的参数类型_Java 基础 14 方法的重载 与 方法参数类型详解

1.1 方法重载的概述和特点方法重载概述在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参数个数或者参数类型不同即可。方法重载特点与返回值类型无关&#xff0c;只看方法名和参数列表在调用时&#xff0c;虚拟机通过参数列表的不同来区分同名方法…

crv仪表上的i是什么指示灯_汽车打不着火是怎么回事,仪表盘汽车发动机故障灯亮是什么情况故障指示灯图解大全集...

如果打不着火&#xff0c;那有可能是起动机坏了&#xff0c;有可能是电池没电了&#xff0c;有可能是电路出现了问题&#xff0c;还有可能是点火系统出现了问题。汽车发动机的点火系统主要部件是火花塞和点火线圈&#xff0c;火花塞是一个需要定期更换的易损件。如果火花塞长时…

python极简教程_Python 极简教程(六)运算符

运算符&#xff0c;我们日常生活中使用的加减乘除&#xff0c;都是运算符的一种。当然这种一般我们称为算术运算符&#xff0c;用于处理数字运算的。但是在计算机语言中&#xff0c;还有很多的运算符。用于处理不用的情况。主要有以下几类&#xff1a;算术运算符比较运算符逻辑…

python函数可变长参数_day14 Python函数之可变长参数

函数参数1.形参变量只有在被调用时才分配内存单元&#xff0c;在调用结束时&#xff0c;即刻释放所分配的内存单元。因此&#xff0c;形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量2.实参可以是常量、变量、表达式、函数等&#xff0c;无论实参是…