He estado trabajando para hacer una transición de una aplicación Java de WindowsLookAndFeel a Nimbus, en gran parte con éxito, a pesar de las deficiencias de Nimbus. A mis usuarios en general les gusta el Nimbus LaF, pero no me gustaron algunos detalles, algunos de los cuales cambié al consultar preguntas anteriores en este sitio. Ejemplo: copié el LeafIcon, ClosedIcon y OpenIcon de Windows LaF (que les gustó) y los uso en la versión de Nimbus, para una buena combinación de LaFs.cambiando cómo maneja Nimbus LaF JTree nodo resaltado
Atascado en un último (?) Problema.
Tengo un JTree con un DefaultCellRenderer subclasificado para crear las pantallas de nodo apropiadas. Esto funciona bien bajo WindowsLookAndFeel.
Problema: En WindowsLaF cuando se selecciona un nodo, el texto del nodo se resalta y el efecto es visualmente fácil de entender. Bajo Nimbus cuando se selecciona un nodo, el resaltado se realiza con una barra de color (bastante oscuro) que se ejecuta en el ancho de la ventana del árbol (no solo el ancho del texto), y el efecto es desconcertante.
Así que: simplemente quiero el tratamiento con WindowsLaF del resaltado del nodo JTree en el Nimbus LaF (es decir, el fondo de color solo tiene el ancho del texto, y preferiblemente en un color mejor que puedo elegir). Sospecho que esto significa que necesito asignar el tipo correcto de Pintor al "Árbol: TreeCell [Enfocado + Seleccionado] .backgroundPainter", pero no sé cómo escribirlo.
Sugerencias bienvenidas.
EDITAR
Véase el punto culminante nodo seleccionado extraña con Java 7!
public class TreeBorder {
public static void main(String[] args) {
try{
for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch(Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(getJTree());
f.pack();
f.setVisible(true);
}
private JTree getJTree() {
JTree jTree = new JTree();
jTree.setCellRenderer(new LocalRenderer());
return jTree;
}
});
}
private static class LocalRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus) {
DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasfocus);
if(true) {
result.setFont(new JLabel().getFont());
Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
result.setIcon(icon);
}
return(result);
}
}
}
Adición a mi publicación: por supuesto, si hay una manera más fácil que un pintor, sería aún mejor. Intenté simplemente cambiar Tree.selectionBackground por un color menos distrayente, pero Nimbus parece ignorar la modificación. – user1359010
Además de mi comentario. No puede establecer Tree.selectionBackground directamente, pero este color se deriva de numbusSelectionBackground, por lo que nimbUID.put ("nimbusSelectionBackground", nuevo ColorUIResource (205,208,216)); produce algunos del efecto deseado (un Tree.selectionBackground más ligero). Todavía se resalta una fila en lugar de solo el texto, por lo que la ayuda para un pintor aún sería apreciada. – user1359010
@oliholz, por favor, puede comentar su generosidad, seguro de que nunca voy a ver esta pregunta, porque el concepto clásico de Renderers sobrecarga las propiedades y configuraciones de Nimbus en la mayoría de los casos – mKorbel