【问题标题】:Nimbus JTree presentation error under java version 1.8java 1.8版下Nimbus JTree呈现错误
【发布时间】:2017-06-20 14:00:13
【问题描述】:

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

在我之前使用的 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-version 1.8 的一些问题。

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

jdk1.7

jdk1.8

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

抱歉语法不好,我不是母语人士。

【问题讨论】:

标签: java swing jtree look-and-feel nimbus


【解决方案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);
    });
  }
}

【讨论】:

  • 嘿,这确实解决了我的问题,非常感谢。
【解决方案2】:

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

我几乎一对一地采用了 BasicTreeUI 类中的代码,但有两个小区别。

我必须删除这个类中的两个条件以使其适用于我的程序,因为我无法访问超类的变量。

删除这些部分后,JTree 的外观就恢复正常了。

这里是上面提到的sn-ps代码:

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”属性的处理方式有什么不同。

所以我为我解决了这个问题,但我仍然不确定到底是什么导致了这个问题。

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

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

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2011-06-29
    • 2014-09-28
    • 2017-04-02
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多