2

我正在尝试使用取自http://java.sun.com/products/jfc/tsc/articles/treetable2/index.html的示例,其中我用我的模型替换了文件系统模型。

我最初创建了一个模型,将其显示在 中JTreeTable,但现在我想更新我的模型,然后是JTreeTable(例如,我想在树上添加一个节点、修改一个节点、删除一个节点等)。

我不知道我该怎么做。我看不到允许我做我想做的事情的方法,我只看到一些方法,如treeNodesChanged,treeNodesInserted等,但可能我错过了这个JTreeTable组件的全局逻辑中的一些东西。

此外,我不确定我是否正确创建了模型,因为在各种示例中,我看到人们在“模型”对象(model.insertNodeInto, model.reload)上调用各种方法,尽管我没有模型对象..在上面的示例中, 简称为AbstractTreeTableModel实现TreeTableModel.的抽象类

更新

public class TableModel extends AbstractTreeTableModel 
                         implements TreeTableModel {
 static protected String[]  cNames = {"TrackNumber", "MWRTN", "LSRTN", "RFTN","TrackStatus","Prova","Prova2"};
    // Types of the columns.
 static protected Class[]  cTypes = {TreeTableModel.class,Integer.class, Integer.class, Integer.class, Integer.class,String.class,String.class};

 private ArrayList<Object> data=new ArrayList<Object>();
     public void insertNode(Object node)
     {    this.data.add(node);    super.setRoot(data.get(0));}

在我的主类中,我以这种方式将对象添加到我的模型中:

...
model =new TableModel();
model.insertNode(threatList.get(i)); //inserting the root node
model.addChild(threatList.get(i),threatList.get(j)); // inserting the child
...

然后我将模型传递给我JTreeTable并将其添加到我的框架中:

treeTable = new JTreeTable(model);
JScrollPane scroll=new JScrollPane(treeTable);
scroll.setAutoscrolls(false);
scroll.setPreferredSize(new Dimension(1000,80));
frame.add(scroll);

这是 JTreeTable 类:

public class JTreeTable extends JTable {
protected TreeTableCellRenderer tree;

public JTreeTable(TreeTableModel treeTableModel) {
super();

// Create the tree. It will be used as a renderer and editor. 
tree = new TreeTableCellRenderer(treeTableModel); 

// Install a tableModel representing the visible rows in the tree. 
super.setModel(new TreeTableModelAdapter(treeTableModel, tree));

// Force the JTable and JTree to share their row selection models. 
tree.setSelectionModel(new DefaultTreeSelectionModel() { 
    // Extend the implementation of the constructor, as if: 
 /* public this() */ {
    setSelectionModel(listSelectionModel); 
    } 
}); 
// Make the tree and table row heights the same. 
tree.setRowHeight(getRowHeight());

// Install the tree editor renderer and editor. 
setDefaultRenderer(TreeTableModel.class, tree); 
setDefaultEditor(TreeTableModel.class, new TreeTableCellEditor());  

setShowGrid(false);
setIntercellSpacing(new Dimension(0, 0)); 
setPreferredSize(new Dimension(60,60));
}

/* Workaround for BasicTableUI anomaly. Make sure the UI never tries to 
 * paint the editor. The UI currently uses different techniques to 
 * paint the renderers and editors and overriding setBounds() below 
 * is not the right thing to do for an editor. Returning -1 for the 
 * editing row in this case, ensures the editor is never painted. 
 */
public int getEditingRow() {
    return (getColumnClass(editingColumn) == TreeTableModel.class) ? -1 : editingRow;  
}

// 
// The renderer used to display the tree nodes, a JTree.  
//

public class TreeTableCellRenderer extends JTree implements TableCellRenderer {

protected int visibleRow;

public TreeTableCellRenderer(TreeModel model) { 
    super(model); 
}

public void setBounds(int x, int y, int w, int h) {
    super.setBounds(x, 0, w, JTreeTable.this.getHeight());
}

public void paint(Graphics g) {
    g.translate(0, -visibleRow * getRowHeight());
    super.paint(g);
}

public Component getTableCellRendererComponent(JTable table,
                           Object value,
                           boolean isSelected,
                           boolean hasFocus,
                           int row, int column) {
    if(isSelected)
           setBackground(table.getSelectionBackground());
    else
           setBackground(table.getBackground());

    visibleRow = row;
    return this;
    }
 }

 // 
 // The editor used to interact with tree nodes, a JTree.  
 //

public class TreeTableCellEditor extends AbstractCellEditor implements TableCellEditor {
    public Component getTableCellEditorComponent(JTable table, Object value,
                             boolean isSelected, int r, int c) {
        return tree;
    }

    @Override
    public Object getCellEditorValue() {
        // TODO Auto-generated method stub
        return null;
    }
}

我想要的是在添加(或修改或删除)一个孩子之后触发一个事件。

4

1 回答 1

2

模型是保存数据的类。它必须在每次数据发生变化时告诉它的视图,以便视图自我刷新并显示模型的新数据。这是方法的目标fireXxx()

Like with the other Swing components, when you change the data displayed by the component, you should thus do it by changing the data in the model, and call the appropriate fireXxx methods. The best thing to do is to encapsulate this in the model class, by adding specific methods in your subclass of AbstractTreeTableModel which perform the data modification and fire the appropriate event using one or several calls to fireXxx.

I suggest you read the Swing tutorial about tables and or trees and then apply what you learn here to your tree table. The idea is the same.

于 2011-08-31T08:47:54.773 回答