super-Konstruktor ist nicht super ;)

Status
Nicht offen für weitere Antworten.

DocMcFly

Bekanntes Mitglied
Hallo,

Ich hab die Klasse JTreeTable von Sun heruntergeladen. Jetzt wollte ich eine Hüllenklasse zu dieser Klasse bauen, die es einfach macht, ein paar optische Effekte zu aktivieren. (zB jede zweite Zeile grau im Hintergrund osä.)

Dazu muss ich aber die Methode
Code:
public Component getTableCellRendererComponent(JTable table,
						       Object value,
						       boolean isSelected,
						       boolean hasFocus,
						       int row, int column)
in der Klasse TreeTableCellRenderer manipulieren. Blöderweise liegt diese Klasse aber eingebettet in JTreeTable und wird im Konstruktor sofort gestartet.

Wenn ich in der abgeleiteten Hüllenklasse super(...) aufrufe, wird der falsche TreeTableCellRenderer aufgerufen.

Ich komme an die Instanz von dem TreeTableCellRenderer ran, kann man so was (verrücktes) machen, wie die Methode nach der Instanzierung überschreiben?

Clemens

PS: Ich möchte keinen Code in der Orginal-Sun-JTreeTable-Klasse ändern und am liebsten von dieser ableiten. Da diese Orginal-Klasse, aber hauptsächlich nur aus einem Konstruktor und der eingebetten Klasse besteht, könnte ich, wenn ich den Konstruktor gleich neuschreibe (kopiere), mir die Orgnial-Klasse gleich sparen.
 
Ich hab die Klasse nie benutzt, aber da wird's doch wohl eine setCellRenderer oder Ähnliches geben...
 
Also wenn ich den Code richtig deute, passiert ja mehr im Konstruktor als dass nur der Renderer gesetzt wird. Wenn ich jetzt von JTreeTable ableite und den Konstrukter der parent-Klasse werde, wird ja erst ein Model gebaut und der Renderer gesetzt und dann kann ich den wieder überschreiben...
Ist doch nicht so richtig clever? Oder ? Dann doch lieber ganz neuen Konstruktor... vielleicht noch setModel() überladen. Damit das runder wird.

Gruß vom fragenden Clemens


Code:
  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)); 	        
    }
 
Die CellRenderer sind dazu da, damit du nicht die ganze Table ableiten musst. Nimm einer Standard-JTable und setze den CellRenderer neu.
 
Die CellRenderer sind dazu da, damit du nicht die ganze Table ableiten musst. Nimm einer Standard-JTable
und setze den CellRenderer neu.

:?: Das verstehe ich nicht so ganz.

In der JTreeTable-Klasse von Sun wird ein Model-Adapter verwendet, der an den CellRenderer gekoppelt ist. Das bedeutet... wenn ich jetzt einfach nur den CellRenderer austausche, geht die TreeTable baden, da das Model noch an dem alten CellRenderer hängt.

:idea: Wenn ich das richtig verstehe bleibt mir nichts anderer übrig als die JTreeTable Klasse von Sun komplett zu vergessen. Teile des Sun-JTreeTable-Konstruktors kopieren und eine eigene Ableitung von JTable kreieren.

Seht ihr das auch so?

Gruß Clemens
 
Oh, da hab ich dich missverstanden. Ich dachte, du benutzt eine normale JTable. JTreeTable kenn ich nicht. Wäre aber ungewöhnlich, wenn diese die Flexibilität mit der Trennung von Renderer und Model aufgibt.
 
Die Trennung wird deshalb aufgegen, weil Sun den JTree im TableModel dazu verwendet um zusehen wieviele Zeilen angezeigt werden und die Funktionalität des Aufklappen ... halt wie ein Baum ... ;-)

Gruß Clemens
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben