0

カスタム 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 として返しますが、Items が db から取り込まれる JComboBox を使用します。Render と Editor はうまく機能します。フィールドをクリックすると、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 には保存されません Render には次のようなパネルがあります:
JLabel (FieldName)
JTextArea (FieldValue)

JTextAreaをクリックすると、次のエディタがあります:
JLabel(FieldName)
JComboBox(DBから入力したFieldValues)

しかし、Edit ComboBox から何かを選択すると、Render TextArea に保存されません。問題は、これがどのように機能するかです。

どのようにレンダーコンポーネントが編集コンポーネントから値を取得しますか?

4

1 に答える 1

1

TreeCellEditorを実装するときは、メソッドをオーバーライドする必要がありますpublic Object getCellEditorValue()。そのメソッドは、編集をキャンセル/終了するときに呼び出されます。このメソッドでは、新しい値を TreeNode に保存するオブジェクトに保存できます。次に、RenderergetTreeCellRendererComponentは、メソッドに新しい値を持つ編集済みオブジェクトを取得しました。

編集:あなたのエディターはそのようになります:

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();
}
}
于 2013-10-31T12:42:58.690 に答える