2015-02-24 6 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. Без этих переопределений внешний вид полностью дефолт, и я знаю, что нет ничего переопределения этих свойств в классе derrived.

Проблема в том, что свойства игнорируются, цвет остается таким же, как и по умолчанию, тогда как InheritDefaults истинно, а подсветка строки отключается, когда она ложна.

То, что я делаю, это простое перекрашивание подсветки строки.

Заранее спасибо

EDIT:

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 (Это первый раз, когда я сделал один). Следует переопределить цвет текста по умолчанию для выбранной строки для компонента oversideTree, но это не так.

Разоружение строки, которая перезаписывает значение по умолчанию, делает то же самое, но работает для всех экземпляров.

+1

для лучшей помощи рано опубликовать SSCCE/MCVE, короткий, работоспособный, компилируется, – mKorbel

+0

Ahh OFC, спасибо. Я новичок во всем этом, поэтому я постараюсь создать один asap – Saquesh

ответ

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

Это отличное спасибо! Он делает именно то, что мне нужно. Мне нужно будет посмотреть на художников, поскольку я незнаком с ними. – Saquesh