java 版本 1.8 下的 Nimbus JTree 呈现错误
Nimbus JTree presentation error under java version 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-version 1.8.[=19 的一些问题=]
jdk1.7和jdk1.8的使用导致两种不同的结果:
jdk1.7
jdk1.8
如您所见,1.8 版本中的水平线丢失了。
抱歉语法不好,我不是母语人士。
原因未知(错误?),但使用 UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true);
而不是 UIManager.put("Tree.drawVerticalLines", true);
(jdk1.8.0_131 在 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);
});
}
}
我想我找到了解决这个问题的方法。
我刚刚实现了自己的 SynthTreeUI-class 并覆盖了 "paintVerticalPartOfLeg()"-方法。
我采用了 BasicTreeUI 中的代码-class 几乎是一对一的,只有两个小区别。
这个 class 中有两个条件,我必须删除它们才能使其适用于我的程序,因为我无法访问超级 class 的变量。
我一删除这些部分,JTree 的外观就恢复正常了。
这里是上面提到的代码片段:
if (!paintLines) {
return;
}
和
if (leftToRight) {
lineX = lineX - getRightChildIndent() + insets.left;
}
else {
lineX = tree.getWidth() - lineX - insets.right +
getRightChildIndent() - 1;
}
因为在运行时没有抛出异常,我猜它可能是第一个导致问题的。
"paintLines" 是一个布尔属性,它证明以下 属性 是否设置为真:
- UIManager.getBoolean("Tree.paintLines")
但是即使我将此 属性 的值设置为 true,它仍然不起作用我不得不创建自己的 TreeUI-class.
我比较了两个版本的 BasicTreeUI-class 的源代码,但在 "paintVerticalPartOfLeg()" 方法和属性 "paintLines" 中找不到任何差异已处理。
所以我解决了这个问题,但我仍然不确定到底是什么导致了这个问题。
你能重建我的问题还是它只影响我?
我认为在不久的将来我没有时间进一步检查这个问题,所以如果有人能找出导致问题的原因,我将不胜感激 post 在此线程中.
现在我正在为已经使用了一段时间的应用程序建立 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-version 1.8.[=19 的一些问题=]
jdk1.7和jdk1.8的使用导致两种不同的结果:
jdk1.7
jdk1.8
如您所见,1.8 版本中的水平线丢失了。
抱歉语法不好,我不是母语人士。
原因未知(错误?),但使用 UIManager.getLookAndFeelDefaults().put("Tree.drawVerticalLines", true);
而不是 UIManager.put("Tree.drawVerticalLines", true);
(jdk1.8.0_131 在 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);
});
}
}
我想我找到了解决这个问题的方法。 我刚刚实现了自己的 SynthTreeUI-class 并覆盖了 "paintVerticalPartOfLeg()"-方法。
我采用了 BasicTreeUI 中的代码-class 几乎是一对一的,只有两个小区别。
这个 class 中有两个条件,我必须删除它们才能使其适用于我的程序,因为我无法访问超级 class 的变量。
我一删除这些部分,JTree 的外观就恢复正常了。
这里是上面提到的代码片段:
if (!paintLines) {
return;
}
和
if (leftToRight) {
lineX = lineX - getRightChildIndent() + insets.left;
}
else {
lineX = tree.getWidth() - lineX - insets.right +
getRightChildIndent() - 1;
}
因为在运行时没有抛出异常,我猜它可能是第一个导致问题的。
"paintLines" 是一个布尔属性,它证明以下 属性 是否设置为真:
- UIManager.getBoolean("Tree.paintLines")
但是即使我将此 属性 的值设置为 true,它仍然不起作用我不得不创建自己的 TreeUI-class.
我比较了两个版本的 BasicTreeUI-class 的源代码,但在 "paintVerticalPartOfLeg()" 方法和属性 "paintLines" 中找不到任何差异已处理。
所以我解决了这个问题,但我仍然不确定到底是什么导致了这个问题。
你能重建我的问题还是它只影响我?
我认为在不久的将来我没有时间进一步检查这个问题,所以如果有人能找出导致问题的原因,我将不胜感激 post 在此线程中.