2012-10-17 3 views
3

Y at-il un exemple de travail pour Editable JxTreeTable .. J'ai essayé quelques méthodes. Mais pas de chance ... Seule la première colonne est modifiable.JXTreeTable Exemple modifiable?

Comment rendre toutes les colonnes modifiables?

Désolé les gars,

Voici mon code 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; 
} 
} 

Merci .... Je veux modifier toutes les colonnes. Mais ce code ne fonctionne qu'avec la première colonne.

+1

Pensez à poster votre code afin que les autres programmeurs puissent commencer à partir de votre code et essayer de le réparer/l'améliorer. –

+0

devrait fonctionner - à condition que isCellEditable de treetableModel renvoie la valeur true. Comme @GuillaumePolet déjà noté, SSCCE s'il vous plait :-) – kleopatra

+0

merci kleopatra. Je l'ai fait. Les valeurs des cellules sont maintenant modifiables mais les valeurs des cellules sont restaurées automatiquement après la perte de focus. Où remplacer l'événement cellchanged ??? –

Répondre

4

Voici un exemple rapide, étapes simples

  • implémentent une TreeTableNode coutume editiable, l'extension AbstractMutableTreeTableNode
  • utilisation que dans un DefaultTreeTableModel
  • instancier un JXTreeTable avec le modèle

Dans le code :

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

Merci beaucoup! –

+0

Lorsque je fais cela, le nœud "root" ne s'affiche pas. Des idées pourquoi pas? –

Questions connexes