【问题标题】:JTree ignoring LaF overridesJTree 忽略 LaF 覆盖
【发布时间】:2015-04-25 19:24:55
【问题描述】:

我最近一直在尝试将系统转换为统一的外观(在本例中为 Nimbus)。但是,某些组件需要更改默认值,我不想仅仅因为单个组件而更改默认值。

我正在尝试覆盖 JTree 组件的行高亮颜色。我已经设法完全关闭它,但这不是我想要的。

通过阅读我尝试使用的各种问题:

UIDefaults overrides = new UIDefaults();
overrides.put("Tree.selectionBackground", new Color(200,200,200));
overrides.put("nimbusSelectionBackground", new Color(200,200,200));

modelTree = new ModelTree(treeModel);

modelTree.putClientProperty("Nimbus.Overrides", overrides);
modelTree.putClientProperty("Nimbus.Overrides.InheritDefaults",true);

modelTree 扩展了标准的 JTree。如果没有这些覆盖,外观是完全默认的,我知道派生类中没有任何东西覆盖这些属性。

问题是属性被忽略,颜色保持与默认相同,而 InheritDefaults 为真,当它为假时,行高亮被关闭。

我所追求的是对行高亮进行简单的重新着色。

提前致谢

编辑:

public static class treeTest extends JPanel {

    public treeTest() {
        super();

        try {
            UIManager.setLookAndFeel(NimbusLookAndFeel.class.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }

        //UIManager.put("Tree.selectionForeground", Color.BLACK);

        UIDefaults overrides = new UIDefaults();

        overrides.put("Tree.selectionForeground", Color.BLACK);

        JTree defaultsTree = new JTree();
        JTree overiddenTree = new JTree();

        overiddenTree.putClientProperty("Nimbus.Overrides", overrides);
        overiddenTree.putClientProperty("Nimbus.Overrides.InheritDefaults", false);

        add(defaultsTree);
        add(overiddenTree);
    }
}

我希望这是一个可以接受的 SSCCE(这是我第一次制作)。 应该覆盖 overiddenTree 组件所选行上的默认文本颜色,但不会。

取消注释覆盖默认值以执行相同操作的行确实有效,但将为所有实例设置。

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布 SSCCE/MCVE,简短、可运行、可编译,
  • 啊,谢谢。我对这一切都很陌生,所以我会尽快创建一个

标签: java swing nimbus uimanager uidefaults


【解决方案1】:

看看Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.plaf.nimbus.*;

public class TreeCellBackgroundPainterTest {
  public JComponent makeUI() {
    UIDefaults d = new UIDefaults();
    AbstractRegionPainter rp = new AbstractRegionPainter() {
      @Override protected void doPaint(
          Graphics2D g, JComponent c, int width, int height, Object[] extendedCacheKeys) {
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, width, height);
      }
      @Override protected final PaintContext getPaintContext() {
        return null;
      }
    };
    d.put("Tree:TreeCell[Enabled+Selected].backgroundPainter", rp);
    d.put("Tree:TreeCell[Focused+Selected].backgroundPainter", rp);

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

    JPanel p = new JPanel(new GridLayout(1, 2, 2, 2));
    p.add(new JScrollPane(new JTree()));
    p.add(new JScrollPane(tree));
    return p;
  }
  public static void createAndShowGUI() {
    try {
      for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(laf.getName())) {
          UIManager.setLookAndFeel(laf.getClassName());
        }
      }
    } catch (ClassNotFoundException | InstantiationException
           | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      ex.printStackTrace();
    }
    JFrame f = new JFrame();
    f.getContentPane().add(new TreeCellBackgroundPainterTest().makeUI());
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
}

【讨论】:

  • 非常感谢!!它正是我需要的。我将不得不研究 Painters,因为我不熟悉他们。
猜你喜欢
  • 1970-01-01
  • 2016-05-07
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多