2013-05-03 33 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 

我如何获得与枚举值相关的我的树节点,但其对树的文本使用全名字符串?换句话说,如何设置树节点用户对象,但名称不同?

*注 - 一个简单的解决办法是违背约定,并命名我的价值观,我希望它们显示在树中,而不是全部大写。

+0

此代码看起来不错。问题可能出在显示的位置,而不是树的创建点。你可以发布显示代码吗? – durron597 2013-05-03 12:40:48

+0

真的没有任何显示代码。创建后,我只是将树添加到我的面板。 – 2013-05-03 13:15:41

回答

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

哇,我没想过必须制作一个自定义树形单元渲染器才能更改树节点文本。 – 2013-05-03 13:14:39

+0

@JavaPVT你也可以直接将星期几的FullName设置为DefaultMutableTreeNode的用户对象,但是你只能操作'String',这不是真的推荐。 – 2013-05-03 13:18:32

+0

我想真正简单的方法是违背约定,只是我的枚举值不是大写的。 – 2013-05-03 13:21:03

0

使这里的变化:

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

那就试试这个:

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

不幸的是,它似乎并没有将类型转换为我的枚举对象。 – 2013-05-03 12:51:35

+0

@JavaPVT它现在应该工作 – Sam 2013-05-03 12:54:15

+0

其实,刚刚意识到,标签不是问题。我希望节点文本显示“星期一”而不是“星期一”,这是如何在类中键入枚举值。 – 2013-05-03 12:59:06