【问题标题】:Swing JTree how custom Render get value from custom Editor?Swing JTree自定义Render如何从自定义Editor中获取价值?
【发布时间】:2013-10-31 12:07:20
【问题描述】:

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

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,其中 Items 从 db 填充。 渲染和编辑器工作得很好我可以点击字段和组合框显示来自 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();
}

但它不保存在 Render textArea 我的意思是在渲染中我有面板:
JLabel(字段名称)
JTextArea(字段值)

当我点击 JTextArea 时,我的编辑器具有:
JLabel(字段名称)
JComboBox(我从 db 填充的 FieldValues)

但是当我从 Edit ComboBox 中选择某些内容时,它不会保存在 Render TextArea 中 所以问题是这应该如何工作?

render组件如何从Edit组件中获取值?

【问题讨论】:

    标签: java swing customization jtree treecellrenderer


    【解决方案1】:

    当你实现 TreeCellEditor 时,你必须重写 public Object getCellEditorValue() 方法。当您取消/退出编辑时,该方法会调用。在此方法中,您可以将新值保存到存储在 TreeNode 中的对象中。然后您的 Renderer 在 getTreeCellRendererComponent 方法中获得了具有新值的编辑对象。

    编辑:你的编辑器是这样的:

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

    【讨论】:

    • 当我更改编辑器组件时调用 getCellEditorValue() 但我找不到 Render 使用它的位置,这并不完全正确。 (我已经实现了这种方法,在我看来,当您需要更改值时,它需要进行验证或其他操作)似乎 Render 使用了一些侦听器,但现在我找不到它。
    • 渲染器不使用它。它只会改变你的对象。渲染器再次读取对象并捕获更改。编辑:getTreeCellRendererComponent 中的渲染器总是获取更改的对象并显示它。
    • 感谢您的帮助。我编辑我的问题(添加 getCellEditorValue 实现)你能告诉它有什么问题吗请尝试返回 box.getSelectedItem().toString() 以防万一。首先我认为 Render 获取值但可以设置它,因为我返回面板,我尝试从 Render 返回 TextArea,结果相同。我也找不到 getCellEditorValue() 的一个很好的解释。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多