2017-06-20 64 views
2

现在我正在为已经使用一段时间的应用程序建立Nimbus外观和感觉。 该应用程序包含一些JTree我想要显示垂直和水平线。java版本1.8下的Nimbus JTree表示错误

在Java版本1.7,我使用的早期,这是很容易设置与在UIDefaults那些特定条目:

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

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

正如上面所暗示的,只要我使用1.7版的jre,只要我使用1.8,JTree中的垂直线就不会显示出来。

我只是想问,如果有人知道这是一个在java 1.8下的Nimbus的已知问题,如果是的话,有没有人知道解决方案或解决方法来解决这个问题?

编辑:这里的一些示例代码来澄清我的问题:

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

} 
} 

这只是一个例子代码,而不是实际的软件我目前的工作,所以我认为这个问题是到一个错误我在两个代码中都做了或者在java版本1.8中遇到了一些问题。

jdk1.7和jdk1.8的使用会导致两种不同的结果:

jdk1.7

jdk1.7

jdk1.8

jdk1.8

正如你所能看到1.8版本的水平线缺失。

对不起,语言不好,我不是母语的人。

+1

为了更快地获得更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –

回答

1

其原因不明(错误?),但在我看来,使用UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true);代替UIManager.put("Tree.drawVerticalLines", true);(在Windows 10 jdk1 8.0_131)为正常工作:

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

嘿,这实际上确实解决了我的问题,非常感谢。 – Demli95

0

我想我找到了一个解决方法这个问题。 我刚刚实现了我自己的SynthTreeUI-class并覆盖了“paintVerticalPartOfLeg()”方法。

我已经采用了BasicTreeUI类的代码,几乎是一对一的,但有两点区别。

这个类有两个条件,为了使它适用于我的程序,我不得不删除它,因为我没有访问超类的变量。

只要我删除这些部分,JTree的出现恢复正常。

这里上面提到的代码片段:

if (!paintLines) { 
    return; 
} 

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

因为没有例外,在运行时抛出,我猜它可能是导致这一问题的第一个。

“paintLines” 是一个布尔属性,如果下面的属性设置为true,这证明:

  • UIManager.getBoolean( “Tree.paintLines”)

但即使我设置这个属性的值为true,它仍然没有工作,我不得不创建我自己的TreeUI类。

我比较了两个版本的BasicTreeUI类的源代码,但在“paintVerticalPartOfLeg()”方法中找不到任何差异,也未找到处理属性“paintLines”的方法。

所以我解决了这个问题,但我仍然不确定究竟是什么原因造成了问题。

你甚至能够重建我的问题,还是只影响我?

我不认为我有时间在不久的将来在这个问题上进一步检查,所以我将不胜感激,如果任何人找出导致问题的原因,将它发布在这个线程。