2015-02-24 79 views
1

我最近一直试图将系统转换为统一的外观和感觉(在这种情况下为Nimbus)。但是某些组件需要改变默认设置,我不想仅仅因为单个组件而改变默认设置。JTree忽略LaF覆盖

我想覆盖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为true,并且当行高亮为false时关闭。

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

在此先感谢

编辑:

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组件的选定行上的默认文本颜色,但不会。

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

+1

为更好地帮助越早张贴SSCCE/MCVE,短,可运行,编译, – mKorbel 2015-02-24 10:47:50

+0

啊OFC,谢谢。我是新手,所以我会尝试尽快创建一个 – Saquesh 2015-02-24 11:52:23

回答

2

看看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(); 
     } 
    }); 
    } 
} 
+0

这是完美的谢谢!它完全符合我的需求。因为我不熟悉他们,所以我得去看看Painters。 – Saquesh 2015-02-24 13:16:31