# JTable in Spalte von anderer JTable nicht editierbar



## Guest (2. Jan 2009)

Hallo,

ich habe eine "äußere" JTable. Je Zeile enthält eine Spalte eine andere "innere" JTable. Diese wird auch wie gewünscht angezeigt. Nun möchte ich jedoch die Zeilen der "inneren" Tabelle auswählen. Wenn ich aber die entsprechende Zelle in der äußeren Tabelle selektiere, kann ich aber nicht auf die Werte (Zeilen/Spalten) der inneren Tabelle zugreifen.


Hat jemand eine Idee, wie ich die Zeilen meiner inneren Tabelle in der äußeren selektierbar machen kann? Ich hatte schon iseditable der äußeren auf true gesetzt, das hilft aber auch nichts :-(

Danke und Grüße


----------



## André Uhres (2. Jan 2009)

Du brauchst einen passenden TableCellEditor, der in getTableCellEditorComponent die value zurückgibt.


----------



## Guest (3. Jan 2009)

Hmm,

die 3te Spalte der äußeren Tabelle beinhaltet die innere JTable. Nun habe ich bei der äußeren (dritten) TableColumn tc
den Renderer gesetzt...


```
tc.setCellRenderer(new TableCellRenderer()
			{ ... }
```
das funktioniert ja auch. Die Tabelle wird ja angezeigt. Wenn ich jedoch


```
tc.setCellEditor(new JTableCellEditor());
```

und dieser gibt mir 


```
public Component getTableCellEditorComponent(JTable table,
					Object value, boolean isSelected, int row, int column) {
				// TODO Auto-generated method stub
				JTable tab = (JTable) value;
				return tab;
			}
```

zurück. Das funktioniert aber nicht. D.h. ich kann meine innere Tabelle noch immer nicht selektieren. Was mache ich da falsch?


----------



## André Uhres (3. Jan 2009)

"tab" deklarieren wir nicht lokal, sondern als Instanzvaiable, die wir in getCellEditorValue zurückgeben.


----------



## Guest (3. Jan 2009)

Hallo nochmal,

ich habe jetzt mal einen Beispielcode erstellt, welcher mir in der letzten Spalte eine selektierbare JTable erzeugt. Ich kann jetzt auch eine JTable selektieren. Sobald ich aber einmal eine Auswahl getroffen habe, ist die "äußere" Tabelle bzw. die dazugehörigen anderen Zeilen nicht mehr selektierbar. Und auch die anderen "inneren" Tabellen können nach einer ersten Selektion nicht mehr weiter selektiert werden. 

Hier mal der Beispielcode in einer Datei...


```
import java.awt.Component;
import java.util.EventObject;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;


public class MainWindow extends JFrame {

	public MainWindow()
	{
	super();
	this.setSize(300, 300);
	TableModel dataModel = new AbstractTableModel() 
			{
          	public int getColumnCount() { return 3; }
          	public int getRowCount() { return 4;}
          	public Object getValueAt(int row, int col) 
          		{ 
          		if(col==2) return new JTable(3,1);
          		return new Integer(row*col);
          		}
			
          	public boolean isCellEditable(int rowIndex,int colIndex)
          	{
          	if(colIndex==2) return true;	
          	return false;	
          	}
          	
    		public Class<?> getColumnClass(int columnIndex) {
    				if(columnIndex == 2) return JTable.class;
    				return super.getColumnClass(columnIndex);
    			}
			
			};
			
      JTable table = new JTable(dataModel);
      JScrollPane scrollpane = new JScrollPane(table);
    
    TableColumn tc = table.getColumnModel().getColumn(2);  
  	tc.setCellRenderer(new TableCellRenderer()
	{

		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			// TODO Auto-generated method stub
			JTable tab = (JTable) value;
			table.setRowHeight(row, 100);
			return tab;
		}
	
	});
  	
  	tc.setCellEditor(new TableCellEditor()
  		{

  			@Override
  			public boolean isCellEditable(EventObject arg0) {
			// TODO Auto-generated method stub
  				return true;
  			}

			@Override
			public Component getTableCellEditorComponent(JTable table,
					Object value, boolean isSelected, int row, int column) {
				return (JTable) value;
			}

			@Override
			public void addCellEditorListener(CellEditorListener arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void cancelCellEditing() {
				// TODO Auto-generated method stub
				
			}

			@Override
			public Object getCellEditorValue() {
				// TODO Auto-generated method stub
				return null;
			}

			
			@Override
			public void removeCellEditorListener(CellEditorListener arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public boolean shouldSelectCell(EventObject arg0) {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public boolean stopCellEditing() {
				// TODO Auto-generated method stub
				return false;
			}
  		
  		}
  	);
		
		
  

      
      this.getContentPane().add(scrollpane); 

	}
	
}
```


----------



## Gast (3. Jan 2009)

@André
>"tab" deklarieren wir nicht lokal, sondern als Instanzvaiable, die >wir in getCellEditorValue zurückgeben.

Hmm, es scheint doch auch so zu gehen, oder wieso muss das als Instanzvariable deklariert werden?


----------



## André Uhres (3. Jan 2009)

Naja, wenn's geht ist es ja gut. Aber was ist mit getCellEditorValue?

EDIT: Dein TableModel enthält keine Daten und implementiert nicht die Methode setValueAt.

EDIT2: Den Editor sollten wir am besten von AbstractCellEditor ableiten.


----------



## Guest (4. Jan 2009)

Hallo André,

vielen Danke für deine Hilfe! Leider klappt es noch immer nicht. Ich habe jetzt ein kleines Model für die innere Tabelle angegeben. Jedoch kann nach Selektion einer Zeile der inneren Tabelle immernoch keine Zeile der äußeren erneut selektiert werden. Diese Funktionalität ist wie "abgeschalten" und meine CPU Auslastung liegt dann bei fast 100%.

Wies funktioniert das nicht, d.h. warum ist keine äußere Zeile selektierbar.

Für deine Hilfe schon ein großes Dankeschön.

Anbei der "neue" Quellcode:

```
import java.awt.Component;
import java.util.EventObject;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;


public class MainWindow extends JFrame {

	public MainWindow()
	{
	super();
	this.setSize(300, 300);
	
	
	
	TableModel dataModel = new AbstractTableModel() 
			{
          	public int getColumnCount() { return 3; }
          	public int getRowCount() { return 4;}
          	public Object getValueAt(int row, int col) 
          		{ 
          		if(col==2) {
          					JTable tab = new JTable(3,1); 
          					tab.setModel(new AbstractTableModel() 
          					{
          					  	public int getColumnCount() { return 1; }
          					  	public int getRowCount() { return 3;}
          					  	public Object getValueAt(int row, int col) 
          					  		{ 
          					  		return new Integer(row*col);
          					  		}
          					  	
          					  
          						
          					  	// cell which contains a JTable must be editable
          					  	// as well as isCellEditable in the assigned cell editor
          					  	public boolean isCellEditable(int rowIndex,int colIndex)
          					  	{
          					  	return true;	
          					  	}
          					  	
          					  	
          						});
          					return tab;
          					}
          		return new Integer(row*col);
          		}
			
          	// cell which contains a JTable must be editable
          	// as well as isCellEditable in the assigned cell editor
          	public boolean isCellEditable(int rowIndex,int colIndex)
          	{
          	if(colIndex==2) return true;	
          	return false;	
          	}
          	
          	// returns for the column which contains a JTable the
    		// JTable class, so that the view
    		// can assign a appropriate renderer
    		public Class<?> getColumnClass(int columnIndex) {
    				if(columnIndex == 2) return JTable.class;
    				return super.getColumnClass(columnIndex);
    			}
			
			};
	
			
			
      JTable table = new JTable(dataModel);
      JScrollPane scrollpane = new JScrollPane(table);
    
    TableColumn tc = table.getColumnModel().getColumn(2);  
  	tc.setCellRenderer(new TableCellRenderer()
	{

		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus,
				int row, int column) {
			// TODO Auto-generated method stub
			JTable tab = (JTable) value;
			table.setRowHeight(row, 100);
			return tab;
		}
	
	});
  	
  	tc.setCellEditor(new TableCellEditor() 
  		{

  			@Override
  			public boolean isCellEditable(EventObject arg0) {
			// TODO Auto-generated method stub
  				return true;
  			}

			@Override
			public Component getTableCellEditorComponent(JTable table,
					Object value, boolean isSelected, int row, int column) {
				return (JTable) value;
			}

			@Override
			public void addCellEditorListener(CellEditorListener arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void cancelCellEditing() {
				// TODO Auto-generated method stub
				
			}

			@Override
			public Object getCellEditorValue() {
				// TODO Auto-generated method stub
				return new JTable(3,1);
			}

			
			@Override
			public void removeCellEditorListener(CellEditorListener arg0) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public boolean shouldSelectCell(EventObject arg0) {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public boolean stopCellEditing() {
				// TODO Auto-generated method stub
				return false;
			}
  		
  		}
  	);
		
		
  

      
      this.getContentPane().add(scrollpane); 

	}
	
}
```


----------

