jjzjj

Java Swing:扩展 TreeNode

codeneng 2023-03-28 原文

Java Swing: Expanding TreeNode

我正在定制一个闭源客户端应用程序。它在 UI 中有一个树,并且只公开了一个获取所选节点的方法。它返回 TreeNode 的子类。并且没有办法获得对父树的引用。现在我想将选定的节点扩展到它的叶子。

有什么方法可以从 DefaultMutableTreeNode 获取对 JTree 组件的引用?我打算使用 JTree.expandPath() 但我只有对树节点的引用。

我是 Swing 新手,欢迎提出任何实现这一目标的建议。


其实只有JTree知道展开状态,TreeNodes中没有这样的信息。 TreeNodes 在"模型"一侧,并且在 JTree 上没有指针(至少不是默认的,您当然可以使用引用创建自己的,但它有点打破了模式)。

您应该重新考虑您想要进行此扩展的地方,以便您可以访问 JTree(提供有关您的上下文的更多详细信息,以了解更多您想要做什么以及在什么情况下)。

  • 我正在定制一个闭源客户端应用程序。它在 UI 中有一个树,并且只公开了一个获取所选节点的方法。它返回 TreeNode 的子类。并且没有办法获得对父树的引用。现在我想将选定的节点扩展到它的叶子。
  • @sarav - 在这种情况下,恐怕你不走运。如果除了 TreeNode 之外没有任何其他访问权限,则无法控制 JTree 的展开状态。如果您可以访问顶部窗口/组件(或同一窗口中的任何组件),并且确定它的结构是静态的,则可能有一种(非常)肮脏的方式JTree 从那里。
  • @sarav - (快速注意,考虑用这些新细节编辑你的问题,让每个人都能更清楚地看到整个情况)
  • 感谢您的回复。是的,我在这里不走运。寻找其他工作。


查看 DefaultMutableTreeNode 的源代码,我看不出有什么好的方法,但您可以尝试以下方法之一:

  • 扩展 DefaultMutableTreeNode 并存储对树的引用
  • 默认节点具有"用户对象"的概念。您可以将树的引用设置为此对象。它完全不是类型安全的,但可能会起作用。编辑:实际上,仔细研究用户对象的使用方式(作为树路径和 toString() 中的文本表示),以这种方式设置用户对象将破坏 API 的预期用途。所以:讨厌,但可能有效。

树节点是树模型中的一个元素。因此,它没有对作为其视图的 Tree 的任何引用。

有趣的是知道你在哪个对象中:因为你想对鼠标事件做出反应,我猜你可以访问视图层(至少通过取回发起 MouseEvent 的组件,这应该是J树)。如果是这样,您可以获取选定的行并调用 expandPath。从 DefaultMutableTreeNode 构建 TreePath 作为练习 :-)

编辑从下面的评论中,让我澄清我的答案。
您必须使用通过在 DefaultMutableTreeNode 上调用 getPath 生成的 TreePath 来调用 expandPath。

  • 不过,我在他的问题中没有看到对鼠标事件的引用。
  • 但是,如果它确实是对用户点击的响应,那么 event.getSource() 可能是最好的选择。

有关Java Swing:扩展 TreeNode的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  3. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  4. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  5. ruby - 扩展类和实例 - 2

    这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):

  6. ruby - 动态扩展现有方法或覆盖 ruby​​ 中的发送方法 - 2

    假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入

  7. ruby-on-rails - 如何扩展 Ruby Test::Unit 断言以包含 assert_false? - 2

    显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案

  8. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  9. ruby-on-rails - 使用模块扩展带有 "has_many"的插件中的模型 - 2

    我在引擎样式插件中有一些代码,其中包含一些模型。在我的应用程序中,我想扩展其中一个模型。通过在初始值设定项中包含一个模块,我已经设法将实例和类方法添加到相关模型中。但是我似乎无法添加关联、回调等。我收到“找不到方法”错误。/libs/qwerty/core.rbmoduleQwertymoduleCoremoduleExtensionsmoduleUser#InstanceMethodsGoHere#ClassMethodsmoduleClassMethodshas_many:hits,:uniq=>true#nomethodfoundbefore_validation_on_crea

  10. ruby-on-rails - Ruby 1.9.3 -> 2.0 别名方法和扩展 - 2

    我正在尝试将Ruby1.9.3应用程序升级到2.0,除了一个小问题外,一切似乎都很顺利。我写了一个模块,我将其包含在我的模型中以覆盖activerecorddestroy。它将现有的destroy方法别名为destroy!,然后覆盖destroy以更改记录上的deleted_at时间戳。仅当我升级到ruby​​2.0时,destroy!不再破坏记录,但其行为就像我的新覆盖方法一样。知道为什么会这样吗?下面是更相关的代码部分。完整要点here.defself.included(base)base.class_evaldoalias_method:destroy!,:destroyalia

随机推荐