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

java treetable_在Swing中创建TreeTable | 学步园TreeTable是Tree和Table的一个结合-就是一个即能够展开和收起行,同时也能够显示多个列的组件。在Swing的标准包里没有一个叫做JtreeTable的组件,但是我们很容易通过把Jtree做成Jtable的渲染器来创建一个这样的组件。这篇文章就是关于如何使用该技术来创建一个TreeTable。最后实现一个名为TreeTableExample0的例子程序,该例子实现了一个TreeTabl…

大家好,又见面了,我是你们的朋友全栈君。

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。就像文章开始部分显示的图片。 点击表的第一列中的支元素,项目就会象其它树一样的展开和收缩。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135561.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MessageDigest 详解

    MessageDigest 详解一、概述java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如MD5或SHA算法。简单点说就是用于生成散列码。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。关于信息摘要和散列码请参照《数字证书简介》MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。MessageDi

    2022年6月15日
    25
  • 强化学习 — MCTS

    强化学习 — MCTS目录Simulation-BasedSearchMCSearchMCTS上线置信区间算法UCT棋类游戏MCTS搜索Simulation-BasedSearch基于仿真的搜索包含两点:一个是simulation,其次是search。simulation是基于强化学习model进行采样,得到样本数据。但这不是基于和环境交互获得的真实数据。search则是为了利用样本结果来帮我们计算应该采用什么动作,以实现长期利益最大化要理解什么是Simulation-BasedSearch,首先要明白什么是for

    2022年6月18日
    24
  • rhel7+apache+c cgi+动态域名实现web访问

    1.申请动态域名/安装no-ip客户端https://blog.csdn.net/lee244868149/article/details/440958352.yum安装httpd两种方法安

    2021年12月29日
    34
  • C#UDP编程

    C#UDP编程一.UDP协议UDP(UserDatagramProtocol)协议就是“用户数据报协议”,它是一种无连接的协议,无连接主要是和TCP协议相比较的。我们知道当利用TCP协议传送数据的时候,首先必须建立连接(也就是所谓的握手)才可以传输数据。而当计算机利用UDP协议进行数据传输的时候,发送方只需要知道对方的IP地址和端口号就可以发送数据,而并不需要进行连接。由于UDP协议并不需要进行确定

    2022年9月8日
    0
  • phpstorm激活码2022(注册激活)

    (phpstorm激活码2022)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    10.3K
  • 如何查找共享打印机的电脑_怎么通过计算机名连接共享打印机

    如何查找共享打印机的电脑_怎么通过计算机名连接共享打印机大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以电脑为例,查找网络共享打印机的方法有:1、双击网上邻居,查看工作组计算机,找到打印机主机的名字,双击进入,找到打印机,双击添加即可。2、左下角单击开始――设置――控制面板,打印机和传真,添加打印机,下一步,选择“网络打印机”,点击浏览,找到打印机主机名,双击选择,确定即可。打印机(Printer)是计算机的输出设备之一,用于将…

    2022年10月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号