2017-06-20 5 views
2

gerade bin ich dabei, das Nimbus Look and Feel für eine Anwendung zu etablieren, die schon seit einiger Zeit verwendet wird. Die Anwendung enthält einige JTree s, die ich vertikale und horizontale Linien anzeigen lassen möchte.Nimbus JTree-Präsentationsfehler unter Java-Version 1.8

Unter Java-Version 1.7, die ich früher verwendet wurde, war dies einfach mit diesen spezifischen Einträge in der UIDefaults einzurichten:

  • UIManager.put("Tree.drawVerticalLines", true);

und

  • UIManager.put("Tree.drawHorizontalLines", true);

Wie oben angedeutet, funktioniert das völlig einwandfrei, solange ich ein jre mit der Version 1.7 verwende, sobald ich 1.8 benutze, werden die vertikalen Linien in der JTree nicht angezeigt.

Ich wollte nur fragen, ob jemand weiß, ob dies ein bekanntes Problem von Nimbus unter Java 1.8 ist und wenn ja, weiß jemand eine Lösung oder Abhilfe für dieses Problem?

EDIT: Hier einige Beispiel-Code mein Problem zu klären:

public class test 
{ 

public static void main(String args[]) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException 
{ 
    try { 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException 
      | UnsupportedLookAndFeelException e) { 

     e.printStackTrace(); 
    } 

    UIManager.put("Tree.drawVerticalLines", true); 
    UIManager.put("Tree.drawHorizontalLines", true); 
    UIManager.put("Tree.linesStyle", "dashed"); 

    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Root"); 
    top.add(new DefaultMutableTreeNode("Branch1")); 
    top.add(new DefaultMutableTreeNode("Branch2")); 
    top.add(new DefaultMutableTreeNode("Branch3")); 
    ((DefaultMutableTreeNode)top.getFirstChild()).add(new DefaultMutableTreeNode("Leaf1")); 
    ((DefaultMutableTreeNode)top.getFirstChild()).add(new DefaultMutableTreeNode("Leaf2")); 


    JFrame frame = new JFrame(); 
    JTree tree = new JTree(top); 
    frame.setSize(new Dimension(450,300)); 
    JScrollPane scroll = new JScrollPane(tree); 
    frame.add(scroll); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

} 
} 

Dies ist nur ein Beispiel-Code, nicht die eigentliche Software, die ich derzeit arbeite, so denke ich, das Problem bis zu einem Fehler ist Ich habe in beiden Codes oder es ist ein Problem mit der Java-Version 1.8.

Die Nutzung von jdk1.7 und jdk1.8 führt zu zwei unterschiedlichen Ergebnissen:

jdk1.7

jdk1.7

jdk1.8

jdk1.8

Wie Sie können siehe die horizontalen Linien in der 1.8-Version fehlen.

Sorry für schlechte Grammatik, ich bin kein Muttersprachler.

+1

Für bessere Hilfe, früher, ein [MCVE] oder [kurze, selbständige, korrekte Beispiel] (http://www.sscce.org/). –

Antwort

1

Der Grund dafür ist unbekannt (Bug?), Aber es scheint für mich statt UIManager.put("Tree.drawVerticalLines", true); mit UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true); gut zu funktionieren (jdk1 8.0_131 unter Windows 10.):

import java.awt.*; 
import javax.swing.*; 

public class NimbusDrawVerticalLinesTest { 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     try { 
     UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
     // UIManager.put("Tree.drawVerticalLines", true); 
     UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true); 
     UIManager.put("Tree.drawHorizontalLines", true); 
     UIManager.put("Tree.linesStyle", "dashed"); 

     JTree tree = new JTree(); 
//  UIDefaults d = new UIDefaults(); 
//  d.put("Tree.drawVerticalLines", Boolean.TRUE); 
//  tree.putClientProperty("Nimbus.Overrides", d); 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JScrollPane(tree)); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

Hey, das hat mein Problem gelöst, vielen Dank. – Demli95

0

Ich glaube, ich eine Abhilfe gefunden dieses Problem. Ich habe gerade meine eigene SynthTreeUI-Klasse implementiert und die "paintVerticalPartOfLeg()" - Methode überschrieben.

Ich habe den Code aus der BasicTreeUI-Klasse fast eins zu eins mit zwei kleinen Unterschieden angenommen.

Es gibt zwei Bedingungen in dieser Klasse, die ich löschen musste, damit es für mein Programm funktioniert, weil ich keinen Zugriff auf die Variablen der Superklasse hatte.

Sobald ich diese Teile gelöscht habe, ist das Aussehen des JTree wieder normal geworden.

Hier werden die Code-Schnipsel oben erwähnt:

if (!paintLines) { 
    return; 
} 

und

if (leftToRight) { 
     lineX = lineX - getRightChildIndent() + insets.left; 
} 
else { 
    lineX = tree.getWidth() - lineX - insets.right + 
        getRightChildIndent() - 1; 
} 

Da es keine Ausnahme zur Laufzeit geworfen war, ich denke, es ist wahrscheinlich die erste, die das Problem verursacht.

"paintLines" ist ein boolean Attribut, das beweist, wenn die folgende Eigenschaft auf true gesetzt ist:

  • UIManager.getBoolean ("Tree.paintLines")

Aber obwohl ich das Set Wert dieser Eigenschaft zu true, es hat immer noch nicht funktioniert Ich musste meine eigene TreeUI-Klasse erstellen.

Ich habe den Quellcode der BasicTreeUI-Klasse aus beiden Versionen miteinander verglichen, konnte aber keine Unterschiede in der "paintVerticalPartOfLeg()" - Methode feststellen, noch wie das Attribut "paintLines" behandelt wurde.

Also habe ich das Problem für mich gelöst, aber ich bin immer noch nicht sicher, was genau das Problem an erster Stelle verursacht.

Können Sie mein Problem überhaupt rekonstruieren oder betrifft es mich nur?

Ich denke nicht, dass ich die Zeit habe, dieses Problem in naher Zukunft zu überprüfen, also würde ich mich freuen, wenn jemand, der herausfinden soll, was das Problem verursacht, es in diesem Thread posten würde.