使用Nimbus L&F设置JTree选择背景

3

当使用Nimbus L&F时,我该如何设置JTree中选定项的背景颜色?

旧答案中针对类似问题的建议在Nimbus中无效,因此我尝试了以下方法:

final UIDefaults def = new UIDefaults();
def.put( "Tree.background", Color.LIGHT_GRAY );
def.put( "Tree.selectionBackground", Color.RED );
def.put( "Tree.drawHorizontalLines", true );
def.put( "Tree.drawVerticalLines", true );
def.put( "Tree.leftChildIndent", 12 );
def.put( "Tree.rightChildIndent", 12 );
myTree.putClientProperty( "Nimbus.Overrides", def );
myTree.putClientProperty( "Nimbus.Overrides.InheritDefaults", false );

这对于背景、drawHorizontalLinesdrawVerticalLinesleftChildIndentrightChildIndent都有效,但无法为选择背景执行任何操作。

我还尝试设置“Tree.textForeground”、“Tree.foreground”和“Tree.textBackground”的各种颜色,但这些都没有效果。

我也尝试了:

 final Painter<JComponent> painter = new Painter<JComponent>() {
    @Override
    public void paint( final Graphics2D g, final JComponent c, final int w, final int h ) {
       g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
       g.setColor( Color.RED );
       g.fillRect( 0, 0, w, h );
    }
 };
 def.put( "Tree:TreeCell[Enabled+Selected].backgroundPainter", painter );

这也没有任何作用。


不使用渲染器,仅返回翻译后的文本:无法理解 - mKorbel
1个回答

0

Tree:TreeCell[Enabled+Selected].backgroundPainter 在我使用的 JDK1.8.0_66 和 Windows 10 上运行良好。

import java.awt.*;
import javax.swing.*;
import javax.swing.Painter;

public class TreeCellPainterTest {
  public JComponent makeUI() {
    //UIDefaults d = new UIDefaults();
    UIDefaults d = UIManager.getLookAndFeelDefaults();
    d.put("Tree:TreeCell[Enabled+Selected].backgroundPainter", new Painter<JComponent>() {
      @Override public void paint(Graphics2D g, JComponent c, int w, int h) {
        g.setColor(Color.GREEN);
        g.fillRoundRect(0, 0, w - 1, h - 1, 15, 15);
      }
    });
    d.put("Tree:TreeCell[Focused+Selected].backgroundPainter", new Painter<JComponent>() {
      @Override public void paint(Graphics2D g, JComponent c, int w, int h) {
        g.setColor(Color.RED);
        g.fillRect(0, 0, w, h);
      }
    });

    JTree tree = new JTree();
    tree.putClientProperty("Nimbus.Overrides", d);
    tree.putClientProperty("Nimbus.Overrides.InheritDefaults", false);

    JPanel p = new JPanel(new GridLayout(1, 2));
    p.add(new JScrollPane(new JTree()));
    p.add(new JScrollPane(tree));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    try {
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(laf.getName())) {
          UIManager.setLookAndFeel(laf.getClassName());
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new TreeCellPainterTest().makeUI());
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

1
我找到了问题 - 我导入的是 org.jdesktop.swingx.Painter 而不是 javax.swing.Painter。 - FredK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接