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!
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);
}
}
}
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
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
@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