zmiana sposobu, w jaki Nimbus LaF obsługuje podświetlanie węzła JTree

Pracowałem nad przejściem aplikacji Java z WindowsLookAndFeel na Nimbus, w dużej mierze z powodzeniem, pomimo słabości Nimbusa. Moi użytkownicy ogólnie lubią Nimbus LaF, ale nie podobały mi się niektóre szczegóły, z których niektóre zmieniłem, konsultując poprzednie pytania na tej stronie. Przykład: Skopiowałem LeafIcon, ClosedIcon i OpenIcon z Windows LaF (co im się podobało) i użyłem ich w wersji Nimbus, aby uzyskać ładną kombinację LaF.

Utknąłem na jednym ostatnim (?) Problemie.

Mam JTree z subklasowanym DefaultCellRenderer, aby utworzyć odpowiednie wyświetlanie węzłów. Działa to poprawnie w WindowsLookAndFeel.

Problem: Pod WindowsLaF, gdy wybrany jest węzeł, tekst węzła jest podświetlony, a efekt jest wizualnie łatwy do zrozumienia. Pod Nimbusem, gdy wybrany jest węzeł, podświetlanie odbywa się za pomocą paska (dość ciemnego) koloru, który biegnie przez szerokość okna drzewa (nie tylko szerokości tekstu), a efekt jest niepokojący.

Więc: Chcę po prostu, aby traktowanie Windows JTree podświetleniem węzła JTree w Nimbus LaF (tj. Kolorowe tło tylko szerokość tekstu, a najlepiej w lepszym kolorze, który mogę wybrać). Podejrzewam, że to oznacza, że ​​muszę przypisać odpowiedni Painter sortujący do „Tree: TreeCell [Focused + Selected] .backgroundPainter”, ale nie wiem, jak to napisać.

Sugestie najbardziej mile widziane.

EDYTOWAĆ

Zobacz dziwne zaznaczenie węzła za pomocą 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>

questionAnswers(1)

yourAnswerToTheQuestion