2013-05-03 3 views
2

Я заполняю свой JTree узлами из значений перечисления. Но узлы отображаются во всех заглавных текстах. Это нежелательно, так как я хотел бы, чтобы узлы отображались в нижнем регистре.Узлы дерева Java из значений перечисления

пример:

public enum DaysOfTheWeek {  


    MONDAY("Monday", "MON", "First day of the work week."), 
    //etc ... 

    private final String fullName; 
    private final String abbrvName; 
    private final String description; 

    DaysOfTheWeek(String fullName, String abbrvName, String description) { 
     this.fullName = fullName; 
     //etc ... 
    } 

    public String getFullName() { 
     return fullName; 
    } 
} 

Я пробовал:

List<DefaultMutableTreeNode> daysOfWeekNodes = new ArrayList<>(); 

for(DaysOfTheWeek dotw : DaysOfTheWeek.values()) { 

     daysOfWeekNodes.add(new DefaultMutableTreeNode(dotw.getFullName())); 
     daysOfWeekNodes.get(dotw.ordinal()).setUserObject(dotw); 
} 

Узел дисплеи: Понедельник Но я хочу, чтобы показать, как: понедельник

текста на основе Наглядного примера:

Days 
    | 
    ---Monday 
    | 
    ---Tuesday 

не

Days 
    | 
    ---MONDAY 
    | 
    ---TUESDAY 

Как получить мое дерево узел, связанный со значением перечисления, но его текст на дереве, чтобы использовать полное имя строки? Или, другими словами, как установить объект пользователя узла дерева, но его имя отличается?

* note - легкое исправление заключается в том, чтобы идти против соглашения и называть мои значения, как я хочу, чтобы они отображались в дереве, а не во всех прописных.

+0

Этот код выглядит хорошо. Проблема, вероятно, находится в точке отображения, а не в точке создания дерева. Можете ли вы опубликовать код отображения? – durron597

+0

На самом деле нет никакого кода отображения. Я просто добавляю дерево в свою панель после его создания. –

ответ

3

Вам нужно использовать TreeCellRenderer.

Вот один из способов осуществить это:

import java.awt.Component; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.ToolTipManager; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.DefaultTreeModel; 

public class TestTree { 

    public enum DaysOfTheWeek { 

     MONDAY("Monday", "MON", "First day of the work week."), TUESDAY("Tuesday", "TUE", "Second day of the work week"); 
     // etc ... 

     private final String fullName; 
     private final String abbrvName; 
     private final String description; 

     private DaysOfTheWeek(String fullName, String abbrvName, String description) { 
      this.fullName = fullName; 
      this.abbrvName = abbrvName; 
      this.description = description; 
     } 

     public String getFullName() { 
      return fullName; 
     } 

     public String getAbbrvName() { 
      return abbrvName; 
     } 

     public String getDescription() { 
      return description; 
     } 
    } 

    public class MyTreeCellRenderer extends DefaultTreeCellRenderer { 

     @Override 
     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, 
       boolean hasFocus) { 
      Component cell = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
      if (value instanceof DefaultMutableTreeNode && ((DefaultMutableTreeNode) value).getUserObject() instanceof DaysOfTheWeek) { 
       ((JLabel) cell).setText(((DaysOfTheWeek) ((DefaultMutableTreeNode) value).getUserObject()).getFullName()); 
      } 
      return cell; 
     } 
    } 

    private JFrame f; 
    private JTree tree; 

    protected void initUI() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Days"); 
     for (DaysOfTheWeek dotw : DaysOfTheWeek.values()) { 
      root.add(new DefaultMutableTreeNode(dotw)); 
     } 
     final DefaultTreeModel model = new DefaultTreeModel(root); 
     tree = new JTree(model); 
     tree.setRootVisible(true); 
     tree.setShowsRootHandles(true); 
     ToolTipManager.sharedInstance().registerComponent(tree); 
     tree.setCellRenderer(new MyTreeCellRenderer()); 
     f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.add(new JScrollPane(tree)); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTree().initUI(); 
      } 
     }); 
    } 

} 

Посмотрите на JTree tutorial.

+0

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

+0

@JavaPVT вы также можете установить FullName дней недели как пользовательский объект DefaultMutableTreeNode, но тогда вы будете манипулировать только 'String', что на самом деле не рекомендуется. –

+0

Я думаю, что очень простой способ - пойти против конвенции и просто называть мои значения перечисления не в верхнем регистре. –

0

Внести изменения здесь:

List<DefaultMutableTreeNode> daysOfWeekNodes = new ArrayList<DefaultMutableTreeNode>(); 

Тогда попробуйте это:

titleLabel.setText(node.getFullName()); 
+0

К сожалению, не похоже, что узел будет набирать cast для моего объекта перечисления. –

+0

@JavaPVT Теперь он должен работать – Sam

+0

На самом деле, только что понятый, ярлык не проблема. Я хочу, чтобы текст узла отображался как «понедельник», а не «MONDAY», а именно, как вводится значение перечисления в классе. –

Смежные вопросы