JTree игнорирует переопределения LaF
Недавно я пытался преобразовать систему в единый внешний вид (в данном случае 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. Без этих переопределений внешний вид полностью по умолчанию, и я знаю, что нет ничего переопределяющего эти свойства в классе derrived.
Проблема в том, что свойства игнорируются, цвет остается тем же, что и по умолчанию, в то время как 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 ответ
Взгляните на Nimbus Defaults (Учебные руководства Java™> Создание графического интерфейса с помощью JFC/Swing > Изменение внешнего вида )
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();
}
});
}
}