gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:40 25 4
gpt4 key购买 nike

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

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

我有一个带有子类 DefaultCellRenderer 的 JTree 来创建适当的节点显示。这在 WindowsLookAndFeel 下工作正常。

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

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

欢迎提出建议。


编辑

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

enter image description here

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);
}
}
}

最佳答案

编辑

“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 方法中:

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

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

关于java - 更改 Nimbus LaF 处理 JTree 节点突出显示的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com