简体   繁体   中英

JTree Nimbus Selectionbackground not Working on Java 1.8

I've modified the JTree SelectionBackground by following this approach .It's working fine in Java 1.7.x whereas the selection is white is Java 1.8.Ref Screenshot. Is there any way to fix it.

在此处输入图片说明

MCVE code to reproduce this problem

import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIDefaults;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;


public class Test {

public static void main(String[] args) {
    setNimbusLookAndFeel();
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            treeTest();
        }
    });
}

private static void setNimbusLookAndFeel() {
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Test.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
}

public static void treeTest() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTree tree = new JTree();
    setLAF(tree);
    setCellRenderer(tree);
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
    for (int i = 0; i < 10; i++) {
        DefaultMutableTreeNode node = new DefaultMutableTreeNode("Parent " + i);
        for (int j = 0; j < 10; j++) {
            node.add(new DefaultMutableTreeNode("Child " + j));
        }
        root.add(node);
    }
    tree.setModel(new DefaultTreeModel(root));
    tree.setSelectionPath(new TreePath(root.getPath()));
    frame.add(new JScrollPane(tree));
    frame.pack();
    frame.setVisible(true);
}

private static void setLAF(JTree tree) {
    UIDefaults paneDefaults = new UIDefaults();
    paneDefaults.put("Tree.selectionBackground", null);
    tree.putClientProperty("Nimbus.Overrides", paneDefaults);
    tree.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
    tree.setBackground(Color.WHITE);
}

private static void setCellRenderer(JTree tree) {
    tree.setCellRenderer(new DefaultTreeCellRenderer() {
        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {
            Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
            setBackgroundSelectionColor(Color.BLUE);
            return c;
        }

    });
}
}

You might be able to use setBackground(...) instead of setBackgroundSelectionColor(...) :

tree.setCellRenderer(new DefaultTreeCellRenderer() {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {
        JComponent c = (JComponent) super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
        //setBackgroundSelectionColor(Color.BLUE);
        c.setBackground(selected ? Color.BLUE : tree.getBackground());
        c.setOpaque(true);
        return c;
    }
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM