2012-10-17 45 views
3

有沒有可編輯JxTreeTable的工作示例..我曾嘗試過一些方法。但沒有運氣......只有第一列是可編輯的。JXTreeTable可編輯示例?

如何讓所有列可編輯?

對不起球員,

這裏是我的SRC代碼:

/* 
* 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; 
} 
} 

謝謝....我想編輯的所有列。但是這個代碼只適用於第一列。

+1

考慮發佈您的代碼,以便其他程序員可以從您的代碼開始並嘗試修復/增強它。 –

+0

應該工作 - 只要treetableModel的isCellEditable返回true。正如@GuillaumePolet已經提到的,SSCCE請:-) – kleopatra

+0

謝謝kleopatra。我做的。現在單元格值是可編輯的,但單元格值在焦點丟失後會自動恢復。在哪裏覆蓋cellchanged事件??? –

回答

4

這裏有一個簡單的例子,簡單的步驟

  • 實現自定義editiable 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)); 
+0

非常感謝! –

+0

當我這樣做時,「根」節點不顯示。任何想法爲什麼不呢? –