Ошибка представления Nimbus JTree в версии java 1.8

прямо сейчас я устанавливаю Nimbus Look and Feel для приложения, которое уже используется в течение некоторого времени. Приложение содержит несколько JTree, которые я хочу отображать вертикальными и горизонтальными линиями.

В версии Java 1.7, которую я использовал ранее, это было легко настроить с помощью этих конкретных записей в UIDefaults:

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

и

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

Как указано выше, это работает совершенно нормально, пока я использую jre с версией 1.7, как только я использую 1.8, вертикальные линии в JTree не будут отображаться.

Я просто хотел спросить, знает ли кто-нибудь, является ли это известной проблемой Nimbus под java 1.8, и если да, то знает ли кто-нибудь решение или обходной путь этой проблемы?

РЕДАКТИРОВАТЬ: Вот пример кода, чтобы прояснить мою проблему:

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 отсутствуют.

Извините за плохую грамматику, я не носитель языка.


person Demli95    schedule 20.06.2017    source источник
comment
Чтобы быстрее получить помощь, опубликуйте минимально воспроизводимый пример или Короткий, автономный, правильный пример.   -  person Andrew Thompson    schedule 20.06.2017


Ответы (2)


Причина неизвестна (ошибка?), но у меня, кажется, все работает нормально, используя 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);
    });
  }
}
person aterai    schedule 21.06.2017
comment
эй, это действительно решило мою проблему, большое спасибо. - person Demli95; 21.06.2017

Я думаю, что нашел обходной путь к этой проблеме. Я только что реализовал свой собственный класс SynthTreeUI и перезаписал метод "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("Дерево.paintLines")

Но даже при том, что я установил значение этого свойства в true, оно все равно не сработало, мне пришлось создать свой собственный класс TreeUI.

Я сравнил исходный код класса BasicTreeUI из обеих версий друг с другом, но не смог найти никаких различий ни в методе «paintVerticalPartOfLeg()», ни в том, как обрабатывается атрибут «paintLines».

Итак, я решил проблему для себя, но я до сих пор не уверен, что именно вызвало проблему.

Вы вообще можете реконструировать мою проблему или она касается только меня?

Я не думаю, что у меня есть время, чтобы проверить эту проблему в ближайшем будущем, поэтому я был бы признателен, если бы кто-нибудь, кто узнает, что вызывает проблему, опубликовал бы это в этой теме.

person Demli95    schedule 21.06.2017