2012-04-26 6 views
8

Ich habe gearbeitet, um eine Java-Anwendung von WindowsLookAndFeel zu Nimbus, weitgehend erfolgreich, trotz Nimbus Schwächen zu überführen. Meine Nutzer mögen die Nimbus LaF im Allgemeinen, aber sie mögen keine Details, von denen ich einige geändert habe, indem ich frühere Fragen auf dieser Seite konsultiert habe. Beispiel: Ich habe LeafIcon, ClosedIcon und OpenIcon von Windows LaF kopiert (was sie mochten) und sie in der Nimbus-Version für eine schöne Kombination von LaFs verwendet.ändern, wie Nimbus LaF behandelt JTree Node Hervorhebung

Stuck auf ein letztes (?) Problem.

Ich habe ein JTree mit einem Unterklasse DefaultCellRenderer, um die entsprechenden Knotenanzeigen zu erstellen. Dies funktioniert unter WindowsLookAndFeel einwandfrei.

Problem: Unter WindowsLaF, wenn ein Knoten ausgewählt ist, ist der Text des Knotens hervorgehoben, und der Effekt ist visuell einfach zu verstehen. Unter Nimbus, wenn ein Knoten ausgewählt ist, wird die Hervorhebung mit einem Balken von (ziemlich dunkler) Farbe gemacht, der die Breite des Baumfensters (nicht nur die Breite des Textes) ausfüllt, und der Effekt ist beunruhigend.

Also: Ich möchte einfach WindowsLaF Behandlung von JTree Knoten Hervorhebung in der Nimbus LaF (dh farbigen Hintergrund nur die Breite des Textes, und vorzugsweise in einer besseren Farbe, die ich wählen kann). Ich vermute, das bedeutet, ich muss "Tree: TreeCell [Focused + Selected] .backgroundPainter" die richtige Art Painter zuweisen, aber ich weiß nicht, wie man es schreibt.

Vorschläge sehr willkommen.


EDIT

Siehe den seltsamen ausgewählten Knoten Highlight mit Java 7!

enter image description here

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); 
     } 
    } 
} 
+0

Nachtrag zu meinem Beitrag: natürlich, wenn es einen einfacheren Weg als einen Maler gibt, wäre das noch besser. Versucht, nur Tree.selectionBackground in eine weniger störende Farbe zu ändern, aber Nimbus scheint die Änderung zu ignorieren. – user1359010

+0

Weiter zu meinem Kommentar. Sie können Tree.selectionBackground nicht direkt festlegen, aber diese Farbe stammt von numbusSelectionBackground, also nimbUID.put ("nimbusSelectionBackground", new ColorUIResource (205,208,216)); erzeugt etwas von dem gewünschten Effekt (ein helleres Tree.selectionBackground). Immer noch eine Zeile markiert, anstatt nur den Text, so würde Hilfe für einen Maler immer noch geschätzt werden. – user1359010

+0

@oliholz ​​bitte können Sie Ihr Kopfgeld kommentieren, sicher, dass ich diese Frage nie zu sehen, weil klassische Renderer-Konzept Nimbus-Eigenschaften und Einstellungen in den meisten Fällen überladen – mKorbel

Antwort

6

bearbeiten

Der "Tree.selectionBackground" Schlüssel ist, was das Highlights auf dem JTree steuert - es auf dem Baum Ebene getan hat, nicht auf der TreeCellRenderer Ebene (was Warum ist es ein wenig verwirrend zu verwalten). Dieser Code erhalten Sie einen Baum, wo Sie die Markierung steuern:

private JTree getJTree() { 

    JTree jTree = new JTree(); 
    jTree.setOpaque(true); 
    jTree.setBackground(Color.white); 
    UIDefaults paneDefaults = new UIDefaults(); 
    paneDefaults.put("Tree.selectionBackground",null); 

    JTextPane pane = new JTextPane(); 
    jTree.putClientProperty("Nimbus.Overrides",paneDefaults); 
    jTree.putClientProperty("Nimbus.Overrides.InheritDefaults",false); 

    jTree.setCellRenderer(new LocalRenderer()); 
    return jTree; 
} 

Und hier ist ein Beispiel für die Markierung auf Rot wechseln. Bitte beachten Sie, dass der Hintergrund des Symbols ebenfalls hervorgehoben wird - dies ist das Standardverhalten für Nicht-Nimbus L & F zu. Wenn Sie nicht das Symbol wollen hervorgehoben werden, Sie gehen zu haben, etwas schicker als der Standard-JLabel zu verwenden, um die TreeCell zu machen:

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); 
     result.setOpaque(true); 
      if(true) { 
       result.setFont(new JLabel().getFont()); 
       Icon icon = UIManager.getIcon("FileView.floppyDriveIcon"); 
       result.setIcon(icon); 
      } 
      if(sel){ 
       result.setBackground(Color.red); 
      } else{ 
       result.setBackground(Color.white); 
      } 
     return(result); 
    } 

Original-Antwort

Eine der einfachsten Möglichkeiten, dies zu beheben, besteht darin, die ausgewählte Hintergrundfarbe transparent zu machen. Das Problem ist, dass es versucht, den Hintergrund des Etiketts zu malen - das nicht den coolen Nimbus-Maler hat, den die Auswahl von JTree verwendet.So fügen Sie diese Zeile zu getTreeCellRendererComponent Methode:

result.setBackgroundSelectionColor(new Color(0,0,0,0)); 

Eine andere Möglichkeit ist es, den Nimbus Maler für den Hintergrund des TreeCellRenderer zu verwenden - aber das scheint übertrieben in dieser Situation.

+0

hmm ... nicht wirklich, da ich die Frage verstanden habe, dass es darum geht, die Hintergrundfarbe _outside_ des Renderers zu verhindern (während sie _inside_ bleibt). Eine unsichtbare Farbe (wenn sie überhaupt Wirkung hat) würde beides verhindern. – kleopatra

+0

@kleopatra Hehe ... vielleicht werde ich das nächste Mal die ganze Frage lesen. Guter Fang. –

+0

OP hier; Ich bin gerade erst nach einer langen Zeit wieder eingecheckt, erfreut, dass die Frage beantwortet wurde, und es funktioniert. Vielen Dank für den Code und die Information, dass er auf der Tree-Ebene behandelt wird. – user1359010

Verwandte Themen