Tag: jtree

在将一些节点添加到底层模型后,如何刷新JTree?

首先,我要说我不使用DefaultTreeModel。 我实现了自己的TreeModel,所以我不能使用DefaultXXX。 问题是:通过我的模型定义的一些addStuff()方法,我将节点添加到底层数据结构。 然后我通过在addStuff()函数中调用treeNodesChanged()来通知侦听器(我知道有treeNodesInserted方法,但它是相同的。它只是用不同的方法通知侦听器)。 现在,其中一个监听器是我的主窗体中的静态类,这个监听器可以告诉JTree,它也包含在我的主窗体中,用于刷新自身。 如何告诉JTree从模型中“重新加载”其部分或全部节点? 更新:发现这个问题虽然不完全相同,但它给出了我想要的答案。 更新2:我的问题不是如何通知查看器(JTree),而是在模型通知后应该以什么方式重新加载jtree。 首先让我说,我知道刷新树以反映底层更改的唯一方法是调用updateUI(),或重用setModel()方法。 基本上,我的问题是: 假设刚刚通知TreeModelListener(通过TreeModelListener API)模型中发生了更改。 好的,现在呢? 我有这个问题,因为JTree没有实现TreeModelListener。 因此,在我的情况下,监听器是JTree的容器,或实现监听器的内部类,与Jtree位于同一容器中。 所以假设我是一个TreeModelListener实现,和我的兄弟JTree一起幸福地生活在一个JForm中。 突然我的方法treeNodesInserted(TreeModelEvent evt)被调用。 现在我该怎么做? 如果我从我内部调用Jtree.updateUI(),那么模型的侦听器List会抛出ConcurrentModificationexception。 我可以调用updateUI以外的其他东西吗? 我尝试了很多东西,但只有updateUI刷新了JTree。 所以我在听众之外做了。 从JForm,我只是调用模型的方法来改变不正常的结构,然后我调用updateUI。 没有使用TreeModelListener。 UPDATE3:我发现注册了隐式TreeModelListeners。 在我的模型的addTreeModelListener(TreeModelListener监听器)实现中,我放了一个debug system.out行: System.out.println(“listener added: ” + listener.getClass().getCanonicalName()); 当我执行jTree.setModel(model)时,我看到了这个调试输出: 监听器添加:javax.swing.JTree.TreeModelHandler 监听器添加:javax.swing.plaf.basic.BasicTreeUI.Handler 引发ConcurrentModificationException是因为对jtree.updateUI()的调用会重新注册侦听器(只有plaf,而不是两者),因此当我在侦听器通知循环中调用updateUI时会抛出它。 现在刷新树的唯一方法是在TreeModelListener之外执行。 有关更好解决方案的任何意见或想法吗? 我错过了什么吗?

Java:如何在JTree中显示XML文件

我想有办法在JTree显示XML文件的内容。 我已经使用DOM,通过实现自定义TreeModel (和TreeCellRenderer )来完成此操作。 然而它非常笨重(很多变通方法和hackery)并且边缘相当粗糙。 是否有人知道如何让JTree显示XML文件的内容,用SAX解析? 谢谢!

这些错误和警告图标作为java资源在哪里?

我有一个自定义树单元格渲染器,我用它来渲染自定义图标JTree,我真的很喜欢警告图标和JOptionPane分别为警告消息和错误消息显示的错误图标。 显然,我可以使用下面的代码来获取我自己使用的图标,但这很重要,需要我实例化我永远不会使用的对话框: public class ValidationCellRenderer extends DefaultTreeCellRenderer { private Icon warnIcon; private Icon errorIcon; public ValidationCellRenderer() { JOptionPane optionPane = new JOptionPane(new Object(), JOptionPane.WARNING_MESSAGE); warnIcon = optionPane.getIcon(); optionPane = new JOptionPane(new Object(), JOptionPane.ERROR_MESSAGE); errorIcon = optionPane.getIcon(); } } 必须有更好的方法将这些图标作为资源,但我没有找到一种简单的方法来从Java API中执行此操作。 有人有什么建议吗?

在JTree中拖放节点

我很难创建一个JTree,它允许通过在JTree中拖放节点来重组节点。 这似乎应该相对简单。 我在线查看了一些示例,但我似乎无法在自己的代码中实现它。 例如,sun提供的这允许在不同组件之间拖动到树中,而不是从树本身内拖动。 我还发现这可以让你将文本拖到JTree中,但不能在树中拖动。 import java.awt。*; import java.awt.datatransfer。*; import java.awt.event。*; import java.io. *; import javax.swing。*; import javax.swing.tree。*; public class DndTree {public static void main(String args []){Runnable runner = new Runnable(){public void run(){JFrame f = new JFrame(“DnD JTree”); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel top = new JPanel(new BorderLayout()); JLabel dragLabel = new JLabel(“拖我:”); JTextField text = new JTextField(); […]

简单快速的JTree Cell Editor

我有一个带有自定义TreeModel和自定义TreeRenderer的JTree。 树模型包含一堆不同类型的对象。 其中一种类型的显示方式与其他类型不同:显示的文本是对象的两个字段的串联。 当我编辑单元格时,我想用编辑的文本更新其中一个字段。 到目前为止,我的工作得很好。 我的问题:当编辑时显示的文本是2个字段的完整连接值时,即使您实际上只是编辑其中一个字段,也会让人感到困惑。 所以我想只显示用户开始编辑时正在编辑的一个字段的内容。 我尝试使用自定义CellEditor来做这件事,我看到它应该工作的方式,这种方法在我的情况下似乎有点过分。 我只是想在很多情况下改变显示的文本,所以我自然而然地希望实现它,而不是整个CellEditor来完成我的Tree的整个内容。 是否有更快速,更简单的方法,或者我必须使用自定义编辑器? 谢谢

JTree在启动应用程序时添加节点

我想用文件浏览器制作文本编辑器,所以当我启动我的应用程序时,我希望我的程序在JTree上添加节点,这样就可以在My Documents文件夹中显示所有文件和文件夹,并让我能够访问这些文件和文件夹(特别是文件夹)。 我试图弄清楚安德鲁·汤普森是如何从这个例子那样做的,但我失败了。 我设法使用此示例从“我的文档”为所有文件和文件夹创建节点。 但就是这样,当我点击代表文件夹的节点之一时,我无法弄清楚如何为其他文件和文件夹生成节点。 这就是我到目前为止所做的事情: import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeSelectionModel; public class MyTextEditor extends JFrame{ JTree tree; JTabbedPane tabbedPane = new JTabbedPane(); File myDocumentsFolder = new File(“C:/Documents and Settings/User/My […]

难以理解swing的JTable和JTree的渲染器机制

通常,当使用JTable或JTree用户写入并分配时,它是自己的特定单元格渲染器。 从DefaultTableCellRendererinheritance用户的组件是很常见的,并实现了渲染器方法getTableCellRendererComponent 。 事实certificate, DefaultTableCellRenderer实际上是从JLabelinheritance的,因此当调用super(在render方法中)时返回自己(this),因此用户的渲染器也可以类似地返回自己(this)。 这一切都运作良好。 我的问题是它怎么样? 每次该表调用此方法时,都会为其指定不同的参数,并根据这些参数更改输出标签。 如果它确实是标签的同一个实例 – 不应该根据最后一次调用此方法进行更改吗? 是不是意味着所有表格的单元格都是由同一个标签实例组成的,该标签实例保持相同的值(最后一次调用渲染器方法的值)? 我在网上搜索,并在Swing的代码中挖掘,并且找不到任何实际复制输出标签的克隆或复制构造函数 。 我找不到任何证据表明(也许)swing使用reflection,以便每次从头开始重新实例化渲染器。 我已经阅读了关于JTables的Swing 教程,在那里我可以找到下一行: 您可能希望表中的每个单元格都是一个组件。 但是,出于性能原因,Swing表的实现方式不同。 相反,单个单元格渲染器通常用于绘制包含相同类型数据的所有单元格。 您可以将渲染器视为可配置的墨迹标记,该表用于将适当格式化的数据标记到每个单元格上。 当用户开始编辑单元格的数据时,单元格编辑器将接管单元格,从而控制单元格的编辑行为。 他们给出了一个暗示,我所说的确实是正确的,但不解释它是如何实现的。 我无法得到它。 可以吗?

JTree:为各个组设置自定义打开/关闭图标

我知道如何在JTree中设置自定义叶子图标 我知道如何为所有组节点设置自定义关闭/打开图标 但我不能根据组节点名称设置自定义打开/关闭图标,例如节点可以称为电子邮件(因此有一个包络图标很好)或者一组可能被称为任务等等。 我试图通过重写类DefaultTreeCellRenderer的getTreeCellRendererComponent方法来做到这一点 但是更改当前node的icon只会影响下一个节点! 如何为各个组设置自定义打开/关闭图标? 请看一下我的代码: Employee.java package com.ehsunbehravesh.swing; import java.util.Random; public class Employee { public String name; public int id; public boolean isBoss; public Employee[] employees; public Employee(String name, boolean isBoss) { this.name = name; this.isBoss = isBoss; this.id = new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE); } @Override public String toString() { return this.name; } static String […]

在不重新绘制树的情况下更新JTree中的ImageIcon?

基本上我在DefaultTreeNode()的UserObject()中编辑属性private string status=”OK” 。 我有一个CustomRenderer implements DefaultCellRenderer ,它通过呈现TreeNode的UserObject的“OK”属性来设置Icon。 最初,当我选择一个节点时,图标会发生变化。 我正在使用Tree.revalidate()和Tree.repaint() ,并且正在反映更改。 但是,我不确定这是否非常有效。 这样做的正确方法是什么? 我尝试了TreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject))但TreeNodeChanged event不会触发。 因此,每次更改TreeNode的用户工具以查看图形更新时,我是否坚持使用重新绘制整个树?

如何向JTree节点添加复选框以管理多选?

我想构建JTree ,其中包含复选框+图标+数据和树选择算法的节点。