Ändern, wie Nimbus LaF die Hervorhebung von JTree-Knoten handhabt

Ich habe daran gearbeitet, eine Java-Anwendung von WindowsLookAndFeel auf Nimbus umzustellen, größtenteils erfolgreich, trotz Nimbus-Schwächen. Meine Benutzer mochten den Nimbus LaF insgesamt, mochten jedoch einige Details nicht, von denen ich einige durch Konsultation früherer Fragen auf dieser Site geändert habe. Beispiel: Ich habe das LeafIcon, ClosedIcon und OpenIcon von Windows LaF (was ihnen gefiel) kopiert und sie in der Nimbus-Version verwendet, um eine schöne Kombination von LaFs zu erhalten.

Ich habe ein letztes (?) Problem.

Ich habe einen JTree mit einem untergeordneten DefaultCellRenderer, um die entsprechenden Knotenanzeigen zu erstellen. Dies funktioniert gut unter WindowsLookAndFeel.

Problem: Unter WindowsLaF wird bei Auswahl eines Knotens der Text des Knotens hervorgehoben und der Effekt ist visuell leicht verständlich. Wenn unter Nimbus ein Knoten ausgewählt ist, wird die Hervorhebung mit einem Balken von (ziemlich dunkler) Farbe durchgeführt, der die Breite des Baumfensters (nicht nur die Breite des Texts) ausführt, und der Effekt ist nicht überzeugend.

Also: Ich möchte einfach, dass WindowsLaF die Hervorhebung von JTree-Knoten im Nimbus-LaF behandelt (dh farbiger Hintergrund nur die Breite des Texts und vorzugsweise eine bessere Farbe, die ich auswählen kann). Ich vermute, dies bedeutet, dass ich "Tree: TreeCell [Focused + Selected] .backgroundPainter" den richtigen Painter zuweisen muss, aber ich weiß nicht, wie ich es schreiben soll.

Vorschläge sind herzlich willkommen.

BEARBEITEN

Sehen Sie das seltsam ausgewählte Knoten-Highlight mit Java 7!

<code>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);
        }
    }
}
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage