簡體   English   中英

Swing JTree 如何自定義渲染從自定義編輯器中獲取價值?

[英]Swing JTree how custom Render get value from custom Editor?

我嘗試使用自定義 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 從數據庫填充。 渲染和編輯器工作得很好我可以點擊字段和組合框顯示來自數據庫的值。

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 我的意思是在 Render 我有面板:
JLabel(字段名)
JTextArea (FieldValue)

當我點擊 JTextArea 時,我的編輯器有:
JLabel(字段名)
JComboBox(我從數據庫填充的字段值)

但是當我從 Edit ComboBox 中選擇一些東西時,它不會保存在 Render TextArea 中所以問題是這些東西應該如何工作?

渲染組件如何從編輯組件獲取值?

當您實現TreeCellEditor 時,您必須覆蓋public Object getCellEditorValue()方法。 該方法在您取消/退出編輯時調用。 在此方法中,您可以將新值保存到存儲在 TreeNode 中的對象中。 然后你的渲染器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();
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM