帮助使用 JCheckBox 制作 JTree

2023-12-10

我有一个不寻常的情况,我需要一个 JTree,每个节点包含 2 个复选框和一个标签(能够添加一个侦听器来告知何时选中任何潜在的复选框)。我还需要根节点具有相同的布局(我假设这意味着创建一个带有 2 个 JCheckBox 和一个 JLabel 的 JPanel),并且如果选中根节点中的一个复选框,则能够选择树中的所有复选框。

有什么指导或例子吗?我已经检查了这里之前的问题和相关示例......其中一些使我能够达到让树“看起来”的目的,但没有给我实现其背后的操作的方向。

Thanks!


这可能是回顾旧事的好时机J树表代码,这将为您提供在第一列中呈现的树,并可以根据需要自由地将每列的单元格渲染到树节点的右侧,在您的情况下放入复选框和标签,并允许您TableCellEditors 按照您习惯的方式使用您的 JTable。警告是,虽然该链接中的代码可以工作,但它有点复杂。

还有一个替代方案。我在下面演示了一个应该更好的树表实现,称为Outline,由 NetBeans 提供(尽管您不需要使用 NetBeans IDE 进行开发,您只需要 jar)。本文表明上手是多么容易。

我能够在大约 30 分钟内(我打字速度很慢)在 Eclipse 中模拟一个大纲树表的快速示例(将 org-netbeans-swing-outline.jar 导入到我的项目中):

private void buildFrame() {
    frame = new JFrame("Demo");
    frame.setSize(300, 300);
    addStuffToFrame();
    frame.setVisible(true);

}


private void addStuffToFrame() {
    MyTreeNode top = new MyTreeNode("top");
    createNodes(top);
    DefaultTreeModel model = new DefaultTreeModel(top);     
    //here are the netBeans tree table classes 
    OutlineModel outlineModel = 
             DefaultOutlineModel.createOutlineModel(model, new MyRowModel());
    Outline outline = new Outline();
    outline.setRootVisible(true);
    outline.setModel(outlineModel);
    frame.getContentPane().add(new JScrollPane(outline));
}

private void createNodes(MyTreeNode top) {
    MyTreeNode child = new MyTreeNode("child 2");
    top.add(new MyTreeNode("child 1"));
    child.add(new MyTreeNode("g-child1"));
    child.add(new MyTreeNode("g-child2"));
    child.add(new MyTreeNode("g-child3"));
    top.add(child);
    top.add(new MyTreeNode("child3"));
    top.add(new MyTreeNode("child4"));

}

我创建一个 TreeNode 来保存Boolean能够与JTable的内置复选框渲染机制。

public class MyTreeNode extends DefaultMutableTreeNode {
    Boolean data1 = null;
    Boolean data2 = null;
    String name = null;
    MyTreeNode (String name) {
        this.name=name;
    }

    void setData1(Boolean val) {data1=val;}
    void setData2(Boolean val) {data2=val;}
    Boolean getData1() {return data1;}
    Boolean getData2() {return data2;}
    String getName() {return name;}

}

netBeans RowModel 是使其成为表而不是简单的 JTree 的关键:

public class MyRowModel implements RowModel {

    public Class getColumnClass(int col) {
        switch (col) {
        case 0: return String.class;
        case 1: return Boolean.class; //these return class definitions will
        case 2: return Boolean.class; //trigger the checkbox rendering
        default:return null;    
        }
    }

    public int getColumnCount() {
        return 3;
    }

    public String getColumnName(int col) {
        return "";
    }

    public Object getValueFor(Object node, int col) {
        MyTreeNode n = (MyTreeNode)node;
        switch (col) {
        case 0: return n.getName();
        case 1: return n.getData1();
        case 2: return n.getData2();
        default:return null;
        }
    }

    public boolean isCellEditable(Object node, int col) {
        return col > 0;
    }

    public void setValueFor(Object node, int col, Object val) {
        MyTreeNode n = (MyTreeNode)node;
        if (col == 1)      {n.setData1((Boolean)val);}
        else if (col == 2) {n.setData2((Boolean)val);}
        //EDIT:  here is a recursive method to set all children
        //       selected for one of the two checkboxes as it is 
        //       checked by the parent
        for (Enumeration children = n.children();
                       children.hasMoreElements(); ) {
            MyTreeNode child = (MyTreeNode) children.nextElement();
            setValueFor(child, col, val);
        }


    }

}

这是成品,尽管很简单:

替代文本http://img17.imageshack.us/img17/6643/picture1hz.png

我已经更新了setValueFor方法迭代节点的子节点,并在修改父节点时将复选框设置为选中或取消选中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

帮助使用 JCheckBox 制作 JTree 的相关文章

  • java本地时间格式不带年份

    我喜欢将本地时间格式格式化为不带年份的字符串 目前我可以显示包含年份的本地格式 java text DateFormat df java text DateFormat getDateInstance java text DateForma
  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • Java 应用程序启动,ProcessBuilder 一段时间后被阻止

    我正在开发一个 Java 桌面应用程序 我们称之为控制台 包含 3 个按钮 其中两个启动 Win32 应用程序 第三个应该启动一个可执行的 jar ProcessBuilder pb new ProcessBuilder java jar
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav

随机推荐

  • 如何在 Project Reactor 中实现轮询逻辑?

    我有一个方法发送请求以获取作业状态并返回状态 如下所示 Mono
  • JavaScript 中命名函数优于匿名函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript var functionName function 与 function functionName 在 Javascript 中提取函数有两种可能的方法 var foo func
  • 自由飞行相机 - 绕 X 轴奇怪的旋转

    所以我几乎使用矢量和 gluLookAt 之类的东西实现了一个自由飞行相机 所有 4 个方向的移动和绕 Y 轴的旋转都可以正常工作 For the 绕Y轴旋转我计算眼睛和中心向量之间的向量 然后用旋转矩阵旋转它 如下所示 Vector te
  • 使用托管组件链接到静态库

    在为我的个人小应用程序创建 GUI 后 我尝试将其编译为静态库以在另一个项目中使用 GUI 已创建 并通过托管公共引用类执行其他任务 该类当前只有 5 个函数 但将添加到其中 这是我在静态库中的头文件 它将包含在另一个项目中 好吧 至少是一
  • 服务器和客户端的区别

    服务器和客户端有什么区别 它对某些软件安装有什么区别 例如 我检查了如何下载和安装 cvs 其中一位用户询问了服务器或客户端 服务器是等待传入请求的程序或机器 客户端是向服务器发送请求的程序或机器 维基百科 服务器 计算 客户端 计算 对于
  • 文件数量巨大时如何提高perl中的grep效率

    我想使用 perl 从位于以下目录结构的日志文件中 grep 一些日志信息 jobDir jobXXXX host log where XXXX是职位编号 从 1 到几千 下没有其他类型的子目录 jobDir除了下面的日志之外没有其他文件j
  • Oracle:如果行不存在,如何插入

    在 PL SQL oracle 中 如果行不存在 插入行的最简单方法是什么 我想要类似的东西 IF NOT EXISTS SELECT FROM table WHERE name jonny THEN INSERT INTO table V
  • Firefox 上的 event.target

    var x event target event srcElement document getElementById x id style left 200 px document getElementById x id style to
  • 创建项目后更改视图引擎

    我在asp net mvc4中创建了一个项目并将其视图引擎设置为ASPX 现在 我想将 View Engine 更改为 Razor 怎么做 我不想创建一个新项目 我想使用现有项目来更改视图引擎 我们可以从属性或其他方式更改视图引擎吗 应该像
  • 处理塔防游戏 - 塔攻击敌人

    我会保持简短 我正在制作一个塔防游戏作为一个迷你项目 同时我有一些空闲时间 我正在尝试弄清楚如何实现塔 以便能够在敌人进入射程时使用 dist 射击敌人但我只是不知道如何实现使用敌人位置和塔位置的方法 我有一个 CreepSprites 和
  • 如何防止Chrome在自动填充用户名/密码时更改字体?

    我有一个包含用户名和密码输入的登录表单 在 Windows 上的 Chrome 中 在其他浏览器或 Mac 上不会发生这种情况 当将鼠标悬停在 Chrome 密码管理器中保存的用户名上时 字体会发生变化 字体的变化然后改变了输入的宽度 使我
  • dataTableOutput 顶部和底部的空“row-fluid”div

    我有一个使用 renderDataTable 创建输出的闪亮示例 我删除了所有可能的选项 分页 过滤 搜索等 但是 现在我的表输出的顶部和底部有一个空白行 以前是过滤和搜索的地方 仅当我删除了过滤和搜索选项时 如何从数据表包装器内部删除这两
  • 什么是 Mocha 平等测试?

    我正在使用 Mocha 测试 Express Node 应用程序 我想要进行以下测试 比较两个空数组 assert equal 通过 但是 Mocha 给了我以下错误 AssertionError 我应该使用哪种方法才能通过两个空数组的比较
  • ncurses 和 stdin 阻塞

    I have stdin in a select set and I want to take a string from stdin whenever the user types it and hits Enter But select
  • 是否可以“等待yield return DoSomethingAsync()”

    常规迭代器块 即 yield return 与 async 和 await 不兼容吗 这很好地说明了我正在尝试做的事情 async Task
  • Web 服务代理中的 SSL 证书问题

    我正在构建一个 JAVA Web 服务客户端 在其中连接到服务 该服务具有 ssl 证书验证 如何使用 ssl 证书验证来调用此服务 我在使用 Eclipse 构建的客户端中使用 JAX RPC 实现 举个例子将不胜感激 我能够进行网络服务
  • 如何在删除前在php中添加确认框?

    我在 PHP 中创建一个简单的列表 用户可以在其中添加姓名 年龄 电子邮件等 我还添加了一个删除选项 但我想在用户单击删除选项时添加一条确认消息 我尝试搜索 Google 但只找到了 jQuery 和 JavaScript 解决方案 有没有
  • 将一个 JSONAray 项目转换为多个项目

    我有以下字符串 它以列表的形式从数据库返回 我的假设是 该列表包含 3 个项目 但它只显示 1 作为大小 因此它将所有活动项作为一个元素返回 注意 当我尝试获取列表的第一个索引 list get 0 时 它仅返回一个 活动 而不是所有三个
  • 为什么下载 pdf 文档而不是在嵌入/iframe 中显示?

    我们有一个内部网站 其中有一些指向网络服务器上托管的 pdf 文档的链接 如果我打开 Chrome 开发工具 F12 检查链接并添加具有相同 pdf 文档的嵌入 它会下载该文件而不是显示它 我尝试过使用 embed 和 iframe 但仍然
  • 帮助使用 JCheckBox 制作 JTree

    我有一个不寻常的情况 我需要一个 JTree 每个节点包含 2 个复选框和一个标签 能够添加一个侦听器来告知何时选中任何潜在的复选框 我还需要根节点具有相同的布局 我假设这意味着创建一个带有 2 个 JCheckBox 和一个 JLabel