Swing JTree定制渲染器如何从定制编辑器获取价值? [英] Swing JTree how custom Render get value from custom Editor?

查看:122
本文介绍了Swing JTree定制渲染器如何从定制编辑器获取价值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用自定义TreeRenderer制作JTree

I try to make JTree with custom TreeRenderer

public class TextCellRender implements TreeCellRenderer {
    JPanel panel;
    JTextArea text;
    JLabel label;
    LayoutManager Layout;

    public TextCellRender() {
        text = new JTextArea();
        text.setWrapStyleWord(true);
        text.setLineWrap(true);
        text.setSize(360, text.getPreferredSize().height);
        label = new JLabel();
        panel = new JPanel();
        panel.add(label);
        panel.add(text);
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, 
            boolean selected, boolean expanded, boolean leaf,
            int row, boolean hasFocus) {
        Component returnValue = null;
        if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
            Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
            if ((userObject instanceof FieldObj)) {
                FieldObj my = (FieldObj) userObject;
                String fieldText = "";

                text.setText(my.valueList);
                label.setText(my.FieldName);

            }
            return panel;
        }
        return returnValue;
    }
}

并使用自定义编辑器

public class TextCellEdit extends AbstractCellEditor implements TreeCellEditor {    

与getTreeCellEditorComponent一起使用的getTreeCellEditorComponent返回面板,但JComboBox均从db填充. 渲染和编辑器效果很好,我可以单击field,并使用来自db的值显示comboBox.

Wich getTreeCellEditorComponent return panel as getTreeCellEditorComponent but with JComboBox wich Items populates from db. Render and Editor work great i can click on field and comboBox shows with values from db.

public Component getTreeCellEditorComponent(JTree tree, Object value, 
        boolean isSelected, boolean expanded, boolean leaf, int row) {
    if (value != null && value instanceof DefaultMutableTreeNode) {
        Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
        if (userObject instanceof FieldObj) {
            FieldObj my = (FieldObj) userObject;
            box.removeAllItems();
            label.setText(my.FieldName);
            populatebox(my.FieldName);
            box.addItem(my.valueList);
            panel.add(label);
            panel.add(box);
        } else {
            box.addItem("Uknown object type");
        }
        return panel;
    }
}
public Object getCellEditorValue() { 
    System.out.println("getCellEditoValue returns :" + box.getSelectedItem());
    return box.getSelectedItem();
}

但是它不会保存在渲染" textArea中 我的意思是在渲染"中我有以下小组成员: JLabel(字段名称) JTextArea(FieldValue)

But it don't save in Render textArea i mean in Render i have panel with: JLabel (FieldName) JTextArea (FieldValue)

当我单击JTextArea时,我的编辑器已拥有 JLabel(字段名称) JComboBox(我已从数据库填充的FieldValues)

when i click on JTextArea i have my Editor wich have JLabel (FieldName) JComboBox(FieldValues wich i have populated from db)

但是当我从Edit ComboBox中选择某种形式时,它不会保存在Render TextArea中 那么问题是这东西应该如何工作? 渲染组件如何从编辑"组件中获取价值?

but when i chose something form Edit ComboBox it don't save in Render TextArea So the question is how this things should work ? How render component get value from Edit component ?

推荐答案

实现 TreeCellEditor 时,必须覆盖public Object getCellEditorValue()方法.当您取消/退出编辑时,该方法将调用.在这种方法中,您可以将新值保存到存储在TreeNode中的对象中.然后,您的 Renderer 使用getTreeCellRendererComponent方法获得了具有新值的已编辑对象.

When you implement TreeCellEditor you must to override public Object getCellEditorValue() method. That method calls when you cancel/exit from editing. In this method you can save your new value to object that you store in TreeNode. Then your Renderer got edited object with new value in getTreeCellRendererComponent method.

您的编辑器就是这样:

public class TextCellEdit extends AbstractCellEditor implements TreeCellEditor {

private JComboBox<Object> box;
private JLabel label;
private JPanel panel;
private FieldObj my;

public Component getTreeCellEditorComponent(JTree tree, Object value,
        boolean isSelected, boolean expanded, boolean leaf, int row) {

    if (value != null && value instanceof DefaultMutableTreeNode) {
        Object userObject = ((DefaultMutableTreeNode) value)
                .getUserObject();
        if (userObject instanceof FieldObj) {
            my = (FieldObj) userObject;
            box.removeAllItems();
            label.setText(my.FieldName);
            populatebox(my.FieldName);
            box.addItem(my.valueList);
            panel.add(label);
            panel.add(box);
        } else {
            box.addItem("Uknown object type");
        }
        return panel;
    }
}

public Object getCellEditorValue() { 
    System.out.println("getCellEditoValue returns :" + box.getSelectedItem());
    my.FieldName = box.getSelectedItem();
    return box.getSelectedItem();
}
}

这篇关于Swing JTree定制渲染器如何从定制编辑器获取价值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆