# JTable in JTable



## LeaveX (17. Feb 2011)

Hallo,


```
package CellAttr;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class CellAttr extends JFrame {

	Container contentPane;
	JTable table;
	
	public CellAttr() {
		
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		contentPane = this.getContentPane();
		
		table = new JTable(new MyDefaultTableModel());
		table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
		
		
		JScrollPane jsp = new JScrollPane(table);
		
		contentPane.setLayout(new BorderLayout());
		
		contentPane.add(BorderLayout.CENTER, jsp);
		
		setSize(800, 600);
		
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new CellAttr();
	}
	
}
```


```
package CellAttr;

import javax.swing.table.DefaultTableModel;

public class MyDefaultTableModel extends DefaultTableModel {

	Object[] param = {""};
	
	public MyDefaultTableModel() {
		addColumn("test1", param);
	}
	
	

}
```


```
package CellAttr;

import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyTableCellRenderer extends JTable implements TableCellRenderer {
	
	NewDefaultTableModel ndtm;
	
	public MyTableCellRenderer() {
		super(new NewDefaultTableModel());		
	}
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {		
		
		return this;
	}


}
```


```
package CellAttr;

import javax.swing.table.DefaultTableModel;

public class NewDefaultTableModel extends DefaultTableModel {

	Object[] param = {"asdfasdf1", "asfdasdf2", "sadfasdfasdf3", "asdfasdf4", "asfdasdf5", "sadfasdfasdf6"};
	
	public NewDefaultTableModel() {
		addColumn("2", param);		
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
		addColumn("2", param);
	}
	
}
```

Ich will unter einem Spaltennamen mehrere Spalten haben. Die neuen Spalten ohne header werden angezeigt aber ich kann die neuen Spalten nicht anklicken warum? 

MFG
LeaveX


----------



## Blakh (17. Feb 2011)

Weil der Spalteninhalt nur gezeichnet wird. Events werden glaube ich nicht an Componenten innerhalb einer Zelle weitergegeben. Dazu muss man einen eigenen TableCellRenderer schreiben.

How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## slawaweis (17. Feb 2011)

es geht auch ohne Verschachtelung. Hier sind Beispiele, was man alles mit einem JTable machen kann:

JTable Examples

Slawa


----------



## L-ectron-X (17. Feb 2011)

Man muss aber dazu sagen, dass einige davon (bspw. Groupable Header) fehlerhaft sind.
Die Beispiele wurden mit Swing 1.0 beta entwickelt. Wahrscheinlich wurden dann in der Release-Version einige Sachen nochmal verändert, so dass diese Fehler drüber geblieben sind.


----------



## LeaveX (19. Feb 2011)

Das hab ich schon durch. @Lectron stimmt ist fehlerhaft. Aber wie würdet ihr das dann machen? 

MFG
Mike


----------



## slawaweis (19. Feb 2011)

die Beispiele mögen vielleicht fehlerhaft sein, aber sie zeigen wie es gehen kann. Ich würde ein eigenes TableColumnModel und ein eigenes JTableHeader erstellen und so anpassen, wie ich es brauche. Vielleicht unterstützt SwingX oder JIDE so eine Funktionalität, habe ich bisher nicht ausprobiert.

SwingLabs Java™ Desktop Technology
JIDE Software - JIDE Common Layer - The Best Open Source Swing Component Library

Slawa


----------



## L-ectron-X (19. Feb 2011)

Eigentlich alle der kaputten Beispiele, die ich gefunden habe, konnte ich mit einigen wenigen Codezeilen so umbauen, dass sie wieder funktionierten. Die Beispiele basieren meist auf den gleichen Klassen. Hat man erst mal einen Fehler behoben, funktionieren gleich mehr/alle Beispiele.
Etwas knifflig war das _Groupable Header_ Beispiel. Da muss man glaube ich in der paint()-Menthode ein paar Abstände anpassen, weil die sonst das richtige Zeichnen verhindern.


----------



## André Uhres (20. Feb 2011)

LeaveX hat gesagt.:


> JTable in JTable



Hallo LeaveX,

versuch's mal so:


```
/*
 * CellAttr.java
 *
 * benutzt die Klasse TableLayout.java
 * hier findest du sie:
 * http://wiki.byte-welt.net/wiki/TableLayout
 *
 */
import java.awt.*;
import javax.swing.*;

public class CellAttr extends JFrame {

    private TableLayout table;

    public CellAttr() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        table = new TableLayout();
        table.addColumns("test1");
        table.addRow(new JTable(new NewDefaultTableModel()));
        add(new JScrollPane(table), BorderLayout.CENTER);
        setSize(800, 600);
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                CellAttr cellAttr = new CellAttr();
                cellAttr.setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
```

Gruß,
André


----------

