现在,我正在为已经使用了一段时间的应用程序建立Nimbus外观。
该应用程序包含一些JTree,我想要显示垂直和水平线。

在我之前使用的Java版本1.7下,使用UIDefaults中的那些特定条目可以很容易地进行设置:


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





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


正如上面所暗示的,只要我在1.7版的jre上使用jre,就可以很好地工作,而在我使用1.8版的jre时,将不会显示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.8



如您所见,1.8版本中的水平线丢失了。

对不起,语法不好,我不是母语人士。

最佳答案

原因未知(错误?),但使用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);
    });
  }
}

10-08 19:09