更改 Nimbus LaF 处理 JTree 节点突出显示的方式

2024-02-26

我一直致力于将 Java 应用程序从 WindowsLookAndFeel 转换到 Nimbus,尽管 Nimbus 存在缺陷,但基本上还是成功的。我的用户总体上喜欢 Nimbus LaF,但不喜欢一些细节,其中一些细节我通过查阅本网站上以前的问题进行了更改。示例:我从 Windows LaF(他们喜欢的)复制了 LeafIcon、ClosedIcon 和 OpenIcon,并在 Nimbus 版本中使用它们,实现了 LaF 的完美组合。

卡在最后一个(?)问题上。

我有一个带有子类 DefaultCellRenderer 的 JTree,用于创建适当的节点显示。这在 WindowsLookAndFeel 下工作得很好。

问题: 在WindowsLaF下,当选择一个节点时,该节点的文本会突出显示,效果在视觉上很容易理解。在 Nimbus 下,当选择一个节点时,会使用一条(相当暗)颜色的条来完成突出显示,该颜色条与树窗口的宽度(而不仅仅是文本的宽度)一致,并且效果令人不安。

所以:我只是想要 WindowsLaF 处理 Nimbus LaF 中的 JTree 节点突出显示(即彩色背景仅是文本的宽度,并且最好是我可以选择的更好的颜色)。我怀疑这意味着我需要分配正确的排序画家 “Tree:TreeCell[Focused+Selected].backgroundPainter”,但我不知道怎么写。

非常欢迎提出建议。


EDIT

使用 Java 7 查看奇怪的选定节点突出显示!

public class TreeBorder {
    public static void main( String[] args ) {
        try{
            for( UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels() ) {
                if( "Nimbus".equals( info.getName() ) ) {
                    UIManager.setLookAndFeel( info.getClassName() );
                    break;
                }
            }
        } catch( Exception e ) {
            e.printStackTrace();
        }
        SwingUtilities.invokeLater( new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setLocationRelativeTo( null );
                f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                f.getContentPane().add( getJTree() );
                f.pack();
                f.setVisible( true );
            }
            private JTree getJTree() {
                JTree jTree = new JTree();
                jTree.setCellRenderer( new LocalRenderer() );
                return jTree;
            }
        } );
    }

    private static class LocalRenderer extends DefaultTreeCellRenderer {
        @Override
        public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus ) {
            DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasfocus );
                if( true ) {
                    result.setFont( new JLabel().getFont() );
                    Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
                    result.setIcon( icon );
                }
            return(result);
        }
    }
}

Edit

“Tree.selectionBackground”键控制 JTree 上的突出显示 - 它是在树级别完成的,而不是在 TreeCellRenderer 级别上完成的(这就是管理起来有点混乱的原因)。此代码将为您提供一棵树,您可以在其中控制突出显示:

private JTree getJTree() {

    JTree jTree = new JTree();
    jTree.setOpaque(true);
    jTree.setBackground(Color.white);
    UIDefaults paneDefaults = new UIDefaults();
    paneDefaults.put("Tree.selectionBackground",null);

    JTextPane pane = new JTextPane();
    jTree.putClientProperty("Nimbus.Overrides",paneDefaults);
    jTree.putClientProperty("Nimbus.Overrides.InheritDefaults",false);

    jTree.setCellRenderer( new LocalRenderer() );
    return jTree;
}

这是将突出显示更改为红色的示例。请注意,图标的背景也会突出显示 - 这也是非 Nimbus L&F 的默认行为。如果您不想突出显示图标,则必须使用比默认 JLabel 更奇特的东西来呈现 TreeCell:

    public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus ) {
        DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent( tree, value, sel, expanded, leaf, row, hasfocus );
        result.setOpaque(true);
            if( true ) {
                result.setFont( new JLabel().getFont() );
                Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
                result.setIcon( icon );
            }
            if(sel){
                result.setBackground(Color.red);
            } else{
                result.setBackground(Color.white);
            }
        return(result);
    }

原答案

解决此问题最简单的方法之一是将选定的背景颜色设置为透明。问题是它正在尝试绘制标签的背景 - 它没有 JTree 选择所使用的很酷的 Nimbus 画家。所以添加这一行到getTreeCellRendererComponent method:

result.setBackgroundSelectionColor(new Color(0,0,0,0));

另一种选择是使用 Nimbus Painter 作为 TreeCellRenderer 的背景 - 但在这种情况下这似乎有点矫枉过正。

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

更改 Nimbus LaF 处理 JTree 节点突出显示的方式 的相关文章

随机推荐

  • 如何在 Spring Tools Suite 上添加 Spring roo

    我已经安装了 sts 但创建的新 roo 项目不存在 我需要做什么才能添加 spring roo 在以前的版本中我可以创建它 但在 3 5 0 中不行 在 Spring 工具套件中 单击仪表板中的 扩展 链接 搜索 Spring Roo 并
  • “known_hosts”文件中的 ECDSA 条目由哪些部分组成?

    我正在尝试从我的文件中提取 ECDSA 公钥已知主机归档该文件ssh用于验证主机 我下面有一个例子 这是我的known hosts 文件中 127 0 0 1 ecdsa sha2 nistp256 的条目 AAAAE2VjZHNhLXNo
  • Express 应用程序 - 更改基本 url

    我正在构建一个问答应用程序本教程 http engineering paiza io entry 2016 03 10 115345一切顺利 但我需要更改更改通过配置文件提供应用程序的基本根的机会 现在 该应用程序在 localhost 8
  • 使用 jquery 将表单值传递到 iframe 的 src url

    我一直让自己发疯去尝试做看似简单的事情 我有一张表格 我可以在其中询问邮政编码 在您输入邮政编码后 我使用 colorbox 弹出带有 iframe 的灯箱 我需要将表单中的邮政编码值传递到 iframe 的源 URL 中 我的表单代码如下
  • 下拉框显示的高度[重复]

    这个问题在这里已经有答案了 可能的重复 调整下拉框中列表的高度 https stackoverflow com questions 5600646 adjust the height of the list in dropdown box
  • std::set 2D 点的自定义比较器

    我需要一个非重复的 2D 点列表 所以我使用std set具有自定义比较功能 我使用的函数在插入点后出现问题 因为有时std find找不到已经插入的点 const double tolerance 0 1 struct MyPoint2D
  • 从Optional<>转换为ArrayList<>

    我有以下情况 public ArrayList a getMethods return b c test 所以 我的问题是b c test 返回一个值Optional a 作为返回类型 但我需要返回一个ArrayList a 所以 我尝试将
  • 完整原型太大而无法保存,已清除变量

    我在渲染谷歌应用程序引擎代码时遇到此错误 有人知道这个错误吗 你在使用appstats吗 当 appstats 记录有关应用程序的状态时 尤其是在堆栈上存储大量数据时 可能会发生这种情况 它没有害处 但在 appstats 中检查调用时您将
  • 如果焦点是 edittext,则禁止滚动 recyclerview

    我有一个带有水平滚动的回收器视图 recyclerview 中的每个项目都有编辑文本 当我单击 edittext 时 recyclerview 滚动到末尾 我怎样才能禁止滚动 谢谢 您可以在 EditText 上设置焦点事件侦听器以禁用焦点
  • 黑莓 - 应用程序已在商店上架;我可以更改代码签名密钥吗

    不久前 我们为客户构建了一个应用程序 使用我们公司的密钥对其进行签名 并将其放在 BlackBerry App World 商店中 此后我们终止了与客户的合同 他们现在已经对该应用程序进行了进一步的 内部 开发 并要求我们提供签名密钥 以便
  • 如何从 Azure AD 获取用户列表?

    我正在使用 asp net core MVC 我想从 Azure AD 读取用户 我读了很多微软文档 我知道我必须使用 GraphAPI 来做到这一点 但我不知道如何做 现在一切都让我感到困惑 我不知道在哪里放置代码 我不知道在哪里获取 G
  • create-react-app eintegrity 错误窗口

    当我开始在 Windows 10 电脑中创建 React 应用程序时 出现了这些错误 请帮我解决这个问题 PS F gt npm install g create react app C Users Harshit Singh AppDat
  • R:调整圈图中的标签

    我有下面的代码 我试图使用令人惊叹的包 circlize 制作一个圆形图 我读过这个小插图并承认其中一些内容有点超出了我的理解范围 我想知道是否有一种快速方法可以删除图表上的所有标签 包括刻度线 然后按照与扇区相同的角度以浅灰色重新添加奥迪
  • 是否可以在 GDB 中命名断点?

    有没有办法在 GDB 中标记 命名断点 以便更容易地识别它们 例如 info b 如果是这样 怎么办 不 没有办法做到这一点 http users ece utexas edu adnan gdb refcard pdf http user
  • 删除 Spark 中不遵循架构的行

    目前 我的表的架构是 root product id integer nullable true product name string nullable true aisle id string nullable true departm
  • 如何创建和使用非常大的调色板纹理以在 opengl 中使用?

    详细信息 我有一个带有统一纹理的 glsl 片段着色器 u MapTexture 上面有几千种颜色 最多大约 10k 15k 唯一的 rgb 值 我还有一个统一的调色板纹理 u paletteTexture 大小为 16384 1 我想用它
  • Android 在片段中使用自定义视图改变方向时的奇怪行为

    我有一个FragmentActivity其中显示了一个Fragment默认情况下 该片段由一个EditText a TextView和一个自定义下拉菜单 通过扩展AutoCompleteTextView 如果我的习惯AutoComplete
  • Swift / Instagram API - 如何使用 Instagram 应用程序进行身份验证

    我需要一个AccessToken让用户在我的应用程序中授予访问他自己的 Instagram 帐户的权限 我已经在 Instagram 开发中心注册了所有内容 目前我正在使用简单认证 https github com calebd Simpl
  • Linux 上的 Python 模块 win32com

    我正在编写一些在多个平台下运行的 Python 代码 不幸的是在Win32下 我必须支持一些COM功能 然而 这些行在 Linux 环境下会失败 from pythoncom import PumpWaitingMessages from
  • 更改 Nimbus LaF 处理 JTree 节点突出显示的方式

    我一直致力于将 Java 应用程序从 WindowsLookAndFeel 转换到 Nimbus 尽管 Nimbus 存在缺陷 但基本上还是成功的 我的用户总体上喜欢 Nimbus LaF 但不喜欢一些细节 其中一些细节我通过查阅本网站上以