Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jtreable更新_Java_Jtable_Jtree_Updating_Jtreetable - Fatal编程技术网

Java jtreable更新

Java jtreable更新,java,jtable,jtree,updating,jtreetable,Java,Jtable,Jtree,Updating,Jtreetable,我试图使用从中获取的示例,其中我用我的模型替换了文件系统模型 我最初创建了一个模型,在JTreeTable中显示它,但现在我想更新我的模型,然后更新JTreeTable(例如,我想在树上添加一个节点,修改一个节点,删除一个节点,等等) 我不知道该怎么做。我看不到允许我做我想做的事情的方法,我只看到一些方法,如treeNodeChanged,treeNodeInserted,等等,但我可能错过了这个JTreeTable组件的全局逻辑 此外,我不确定是否正确创建了模型,因为在各种示例中,我看到人们在

我试图使用从中获取的示例,其中我用我的模型替换了文件系统模型

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

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

此外,我不确定是否正确创建了模型,因为在各种示例中,我看到人们在“model”对象上调用各种方法(
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));}
然后,我将模型传递给我的
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;
    }
}

我要做的是在添加(或修改或删除)子对象后触发事件。

模型是保存数据的类。每次数据更改时,它都必须告知其视图,以便视图刷新自身并显示模型的新数据。这是方法
fireXxx()
的目标

与其他Swing组件一样,当您更改组件显示的数据时,您应该通过更改模型中的数据并调用适当的fireXxx方法来完成。最好的做法是将其封装在模型类中,方法是在AbstractTreeTableModel的子类中添加特定的方法,这些方法执行数据修改,并使用对
fireXxx
的一个或多个调用触发适当的事件


我建议您阅读关于和或的Swing教程,然后将在这里学到的知识应用到树表中。想法是一样的。

FireTreeNodeInserted方法需要四个参数:源-插入新元素的节点路径-根节点的路径ChildIndex-新元素子元素的索引-新元素在我的例子中,我必须将名为A1的子元素添加到名为a的父节点,因此,在我的模型中添加了这个之后,我必须调用FireTreeNodeInserted()…我想象的第一个和最后一个参数分别是A和A1…但我不知道如何填充第二个和第三个…第三个应该是包含单个元素的数组:A的子元素列表中A1的索引(从0开始)。如果它是A的第一个子级,那么它应该包含0。第二个参数是从A到根的路径。因此,它应该包含作为第一个元素的A,然后是A的父元素,等等,直到最后一个索引的根节点。DefaultTreeModel(getPathToRoot)中有一个实用方法可以为您实现这一点。嗯……好吧……但我仍然不明白一些事情。。。我是否创建了包含子元素的数组?关于路径…我已经看到了getPathRoot()方法,但是我不知道从哪里开始!
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;
    }
}