1

ここで利用可能なチュートリアルを参照して、スイングでツリーテーブルを実装しました 。メッセージの下にメッセージオブジェクトまたはフィールドオブジェクトが表示される2つの列があります。ノードがフィールドの場合、その値は 2 番目の列に表示されます。値がコレクションである 2 番目の列にセル レンダラーを正常に追加し、セルにコンボ ボックスを追加すると、必要なデータを表示できます。セルエディターを追加すると問題が発生します。以下は私のセルエディタです。

    private class ValueCellEditor extends AbstractCellEditor implements   TableCellEditor {
        JTextField textEditor = new JTextField();
        JComboBox comboBox = new JComboBox();
        Component comp;
        Field field = null;

        private ValueCellEditor(){
            int row=myTreeTable.getSelectedRow();
            Object object= myTreeTable.getValueAt(row, 3);
            TreePath path= myTreeTable.getPathForRow(row);
            Object o= path.getLastPathComponent();
            MyDataNode node=(MyDataNode)o;
            Field f=(Field)node.getNodeDataObject();

            comboBox.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if(field!=null){
                        if(e.getStateChange() == ItemEvent.SELECTED) {
                            field.setSelectedValue(comboBox.getSelectedItem());
                            field.setDefaultValue(comboBox.getSelectedItem());
                        }
                    }
                }
            });

            textEditor.addKeyListener(new KeyAdapter() {
                @Override
                public void keyReleased(KeyEvent e) {
                    if(field!=null){
                        field.setDefaultValue(textEditor.getText());
                    }
                }
            });
        }

        @Override
        public Component getTableCellEditorComponent
                (JTable table, Object value, boolean isSelected, int row, int column) {

            if(value instanceof List<?>) {
                populateComboBox((ArrayList)value);
                comp = comboBox;
            } else {
                textEditor.setText((String)value);
                comp = textEditor;
            }
            return  comp;
        }

        @Override
        public Object getCellEditorValue() {

            if(comp != null && comp instanceof JTextField ) {
                return  textEditor.getText();
            } else if( comp != null && comp instanceof JCheckBox) {
                return comboBox.getSelectedItem();
            }
            return null;
        }

        private void populateComboBox(List<Value> valueList){
            comboBox.removeAll();
            comboBox.setSelectedItem(null);
            for (Value val: valueList) {
                comboBox.addItem(val.getDescription());
            }

            if(field.getSelectedValue() != null) {
                comboBox.setSelectedItem(field.getSelectedValue());
            }
        }
    }

セル エディターのコンストラクターで、以下のコードを追加して、ツリー テーブルの選択された行の現在選択されているノードを取得しようとしました。しかし、「getPathForRow」関数がツリー テーブルをサポートしていないため、入力したコードは機能しません。

        int row=myTreeTable.getSelectedRow();
        Object object= myTreeTable.getValueAt(row, 3);
        TreePath path= myTreeTable.getPathForRow(row);
        Object o= path.getLastPathComponent();
        MyDataNode node=(MyDataNode)o;
        Field f=(Field)node.getNodeDataObject();

これは私が使用しているテーブル モデルです。

    import com.milleniumit.walle.frontend.frontEndDto.Field;

public class MyDataModel extends MyAbstractTreeTableModel {

    static protected String[] columnNames = { "Field", "Value" };
    static protected Class<?>[] columnTypes = 
        { MyTreeTableModel.class, Object.class};

    public MyDataModel(MyDataNode rootNode) {
        super(rootNode);
        root = rootNode;
    }

    public Object getChild(Object parent, int index) {
        return ((MyDataNode) parent).getChildren().get(index);
    }


    public int getChildCount(Object parent) {
        return ((MyDataNode) parent).getChildren().size();
    }


    public int getColumnCount() {
        return columnNames.length;
    }


    public String getColumnName(int column) {
        return columnNames[column];
    }


    public Class<?> getColumnClass(int column) {
        return columnTypes[column];
    }

    public Object getValueAt(Object node, int column) {
        MyDataNode mNode=(MyDataNode)node;
        Object obj =mNode.getNodeDataObject();

        if(column==0){
            return mNode.getName();
        }
        else if (column==1){
            if(obj instanceof Field){
                Field field=(Field)mNode.getNodeDataObject();
                if(field.getFieldDef().getListValue().size()>0){
                    return field.getFieldDef().getListValue();
                }
                else
                    return mNode.getDefaultValue();
            }
            else
                return mNode.getDefaultValue();
        }
        return null;
    }

    public boolean isCellEditable(Object node, int column) {
        return true; // Important to activate TreeExpandListener
    }

    public void setValueAt(Object aValue, Object node, int column) {
        MyDataNode mNode=(MyDataNode)node;

        if (mNode.getNodeDataObject() instanceof Field && column == 1) {
            Field field = (Field) mNode.getNodeDataObject();
            field.setDefaultValue(aValue);
            field.setSelectedValue(aValue);
        }
    }

}

現在選択されているフィールドを取得して、エディターで変更された値を編集できるように、ツリー テーブルの選択されたノードを取得する必要があります。コードのどこが間違っているのか誰か教えてください。このツリー テーブルの現在選択されているノードを取得する正しい方法は何ですか。

4

0 に答える 0