2017-06-20 3 views
2

dès maintenant J'établis la présentation Nimbus à une application déjà utilisée depuis un certain temps. L'application contient quelques JTree s dont je veux avoir à afficher les lignes verticales et horizontales.Erreur de présentation Nimbus JTree sous la version java 1.8

Dans la version java 1.7 que j'ai utilisé plus tôt c'était facile à mettre en place avec les entrées spécifiques dans le UIDefaults:

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

et

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

Comme implicite ci-dessus cela fonctionne totalement bien tant que j'utilise un jre avec la version 1.7, dès que j'utilise 1.8 les lignes verticales dans le JTree ne seront pas affichées.

Je voulais juste demander si quelqu'un sait si c'est un problème connu de Nimbus sous Java 1.8 et si oui, quelqu'un sait-il une solution ou une solution à ce problème?

EDIT: Voici quelques exemples de code pour clarifier mon problème:

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); 

} 
} 

Ceci est juste un exemple de code, pas le logiciel lui-même, je travaille actuellement, donc je pense que la question est à une erreur J'ai fait dans les deux codes ou son un problème avec la version java 1.8.

L'utilisation de jdk1.7 et jdk1.8 conduit à deux résultats différents:

jdk1.7

jdk1.7

jdk1.8

jdk1.8

Comme vous le pouvez voir les lignes horizontales dans la version 1.8 sont manquantes.

Désolé pour la mauvaise grammaire, je ne suis pas un locuteur natif.

+1

Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

Répondre

1

La raison est inconnue (bug?), Mais il semble fonctionner très bien pour moi en utilisant UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true); au lieu de UIManager.put("Tree.drawVerticalLines", true); (jdk1 8.0_131 sous 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 qui a effectivement résolu mon problème, merci beaucoup. – Demli95

0

Je pense avoir trouvé une solution à ce problème. J'ai juste implémenté ma propre classe SynthTreeUI et remplacé la méthode "paintVerticalPartOfLeg()".

J'ai adopté le code hors de la classe BasicTreeUI presque one-to-one avec deux petites différences.

Il y a deux conditions dans cette classe que j'ai dû supprimer pour que cela fonctionne pour mon programme, parce que je n'avais pas accès aux variables de la super classe.

Dès que j'ai supprimé ces parties, l'apparence du JTree est revenue à la normale.

Voici les extraits de code mentionnés ci-dessus:

if (!paintLines) { 
    return; 
} 

et

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

Parce qu'il n'y avait pas d'exception levée lors de l'exécution, je pense qu'il ya probablement la première qui provoque le problème.

"paintLines" est un attribut booléen qui prouve si la propriété suivante est définie sur true:

  • UIManager.getBoolean ("Tree.paintLines")

Mais même si je mets la valeur de cette propriété à vrai, il n'a toujours pas fonctionné, j'ai dû créer ma propre classe TreeUI. J'ai comparé le code source de la classe BasicTreeUI des deux versions, mais je n'ai trouvé aucune différence dans la méthode "paintVerticalPartOfLeg()", ni comment l'attribut "paintLines" a été traité.

J'ai donc résolu le problème pour moi, mais je ne sais toujours pas exactement ce qui a causé le problème en premier lieu.

Êtes-vous même capable de reconstruire mon problème ou est-ce que cela ne m'affecte que moi? Je ne pense pas que j'ai le temps de vérifier plus loin sur ce problème dans un proche avenir, donc j'apprécierais si quelqu'un qui arrive à savoir ce qui cause le problème, l'afficherait dans ce fil de discussion.