2

我用来自枚举值的节点填充我的 JTree。但节点以全部大写文本显示。这是不可取的,因为我希望节点以小写形式显示。

例子:

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);  
}

节点显示为:MONDAY 但我希望它显示为:Monday

基于文本的图形示例:

Days  
    |  
    ---Monday  
    |  
    ---Tuesday

不是

Days  
    |  
    ---MONDAY  
    |  
    ---TUESDAY  

如何让我的树节点与枚举值关联,但它在树上的文本使用全名字符串?或者换句话说,如何设置树节点用户对象,但名称不同?

*注意 - 一个简单的解决方法是违反约定并将我的值命名为我希望它们在树中显示的方式,而不是全部大写。

4

2 回答 2

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 教程

于 2013-05-03T12:58:06.800 回答
0

在这里进行更改:

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

然后试试这个:

  titleLabel.setText(node.getFullName());
于 2013-05-03T12:47:25.447 回答