【问题标题】:JXTreeTable Editable Example?JXTreeTable 可编辑示例?
【发布时间】:2012-10-07 10:14:08
【问题描述】:

是否有任何可编辑 JxTreeTable 的工作示例。我确实尝试了一些方法。但没有运气......只有第一列是可编辑的。

如何使所有列都可编辑?

对不起各位,

这是我的源代码:

/*
* To change this template, choose Tools | Templates
 * and open the template in the editor.
*/
package org;
import java.awt.Color;
import java.awt.Component;
import java.util.EventObject;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.CellEditorListener;
import javax.swing.event.TreeModelListener;
import javax.swing.table.TableCellEditor;
import javax.swing.tree.TreePath;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.decorator.*;
import org.jdesktop.swingx.decorator.HighlightPredicate.ColumnHighlightPredicate;
import org.jdesktop.swingx.painter.CheckerboardPainter;
import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
import org.jdesktop.swingx.renderer.IconValue;
import org.jdesktop.swingx.renderer.StringValue;
import org.jdesktop.swingx.treetable.*;
public class JTreeTable extends JXTreeTable{
public JTreeTable(){
setTreeTableModel(new RandomTextTreeTableModel(5));
    setRowSelectionAllowed(true);

    setDragEnabled(true);
    setEditable(true);
 setTreeCellRenderer(new DefaultTreeRenderer());
    setSelectionBackground(new Color(176, 197, 227));
    setSelectionForeground(new Color(0, 0, 128));

    BorderHighlighter border = new BorderHighlighter(new ColumnHighlightPredicate(1, 2), BorderFactory.createEmptyBorder(0, 6, 0, 6), false, false);
    addHighlighter(border);


}
@Override
public TableCellEditor getCellEditor(int row, int column){
    System.out.println(column);
    return new TableCellEditor() {

        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            //throw new UnsupportedOperationException("Not supported yet.");
            return new JTextField();
        }

        public Object getCellEditorValue() {
            //throw new UnsupportedOperationException("Not supported yet.");
            return "";
        }

        public boolean isCellEditable(EventObject anEvent) {
            //throw new UnsupportedOperationException("Not supported yet.");
            return true;
        }

        public boolean shouldSelectCell(EventObject anEvent) {
            //throw new UnsupportedOperationException("Not supported yet.");
            return true;
        }

        public boolean stopCellEditing() {
            //throw new UnsupportedOperationException("Not supported yet.");
            return false;
        }

        public void cancelCellEditing() {
            //throw new UnsupportedOperationException("Not supported yet.");

        }

        public void addCellEditorListener(CellEditorListener l) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }

        public void removeCellEditorListener(CellEditorListener l) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
    };
}
}class RandomTextTreeTableModel extends DefaultTreeTableModel {

DefaultMutableTreeTableNode Root = null;

RandomTextTreeTableModel(int i) {
    Root = new DefaultMutableTreeTableNode();
    this.setRoot(Root);
    for (int x = 0; x < 5; x++) {
        DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode("HI");
        Root.add(node);
        for (int j = 0; j < i; j++) {
            node.add(new DefaultMutableTreeTableNode(j));
        }
    }
}

@Override
public String getColumnName(int column){
    return "dsdsddds";
}

@Override
public int getColumnCount() {
    return 2;
}


@Override
public Object getValueAt(Object arg0, int arg1) {
    if (arg1 == 1) {
        return new String("hi " + arg0.toString());
    }
    return arg0;
}
}

谢谢...。我想编辑所有列。但此代码仅适用于第一列。

【问题讨论】:

  • 考虑发布您的代码,以便其他程序员可以从您的代码开始并尝试修复/增强它。
  • 应该可以工作 - 只要 treetableModel 的 isCellEditable 返回 true。正如@GuillaumePolet 已经指出的那样,SSCCE 请:-)
  • 谢谢克娄巴特拉。我做到了。现在单元格值是可编辑的,但单元格值在失去焦点后会自动恢复。在哪里覆盖 cellchanged 事件???
  • a) 你的编辑器无效 :-) 但是你为什么要摆弄它呢? b) DefaultMutableTreeTableNode 不是用于子类化,而是用于测试 c) 如果您将 DMTTN 子类化(当然可以这样做:-) 您必须重新实现 setValueAt 才能做一些合理的事情

标签: java swing swingx jxtreetable


【解决方案1】:

这是一个简单的例子,简单的步骤

  • 实现自定义可编辑 TreeTableNode,扩展 AbstractMutableTreeTableNode
  • 在 DefaultTreeTableModel 中使用它
  • 用模型实例化一个 JXTreeTable

在代码中:

/**
 * A custom node implementation.
 */
public static class ArrayNode extends AbstractMutableTreeTableNode {

    public ArrayNode(Object[] data) {
        super(data);
    }

    @Override
    public Object getValueAt(int column) {
        return getUserObject()[column];
    }

    @Override
    public void setValueAt(Object aValue, int column) {
        getUserObject()[column] = aValue;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public Object[] getUserObject() {
        return (Object[]) super.getUserObject();
    }

    @Override
    public boolean isEditable(int column) {
        return true;
    }

}

// usage
ArrayNode root = new ArrayNode(new Object[] {"root", ""});
for (int i = 0; i < 5; i++) {
    root.add(new ArrayNode(new Object[]{"child", "" + i}));
}
JXTreeTable table = new JXTreeTable(new DefaultTreeTableModel(root));

【讨论】:

  • 当我这样做时,“根”节点不显示。有什么想法为什么不呢?
  • 必须在根之前添加节点,才能显示根。我的意思是,根需要一个根。
猜你喜欢
  • 2012-04-28
  • 2010-11-16
  • 2014-02-14
  • 1970-01-01
  • 2012-07-12
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
相关资源
最近更新 更多