我使用枚举值中的节点填充我的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 但我希望它显示为:星期一
基于文本的图形示例:
Days
|
---Monday
|
---Tuesday
不是
Days
|
---MONDAY
|
---TUESDAY
如何让我的树节点与枚举值相关联,但树上的文本使用全名String?或者换句话说,如何设置树节点用户对象但名称不同?
*注意 - 一个简单的解决方法是违反惯例并将我的值命名为我希望它们在树中显示的方式,而不是全部大写。
答案 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();
}
});
}
}
答案 1 :(得分:0)
在此处进行更改:
List<DefaultMutableTreeNode> daysOfWeekNodes = new ArrayList<DefaultMutableTreeNode>();
然后试试这个:
titleLabel.setText(node.getFullName());