Problem mit dem Casting eines Objektes

Curry

Aktives Mitglied
Hallo Leute!

Ich habe ein Problem mit dem Casting eines Objektes. Ich habe viele Spalten in einer Tabelle (mehr als in dem kurzen Beispiel gezeigt werden) und möchste, um den Code übersichtlicher zu machen, die Spalten über eine FOR-Schleife initialisieren.

Dafür habe ich alle Informationen zu einer Spalte in ein zweidimensionales Array gelegt. Beim Durchlaufen dieses Arrays sollen die Spalten initialisiert werden.

Das Problem ist, dass ich verschiedene Typen von TableCellRenderer habe und die muss ich von Object zum entsprechenden Typ casten. Das bereitet mir allerdings unüberwindbare Schwierigkeiten. ;-)

So wie der Code jetzt ist, gibt die Fehlermeldung "cannot find symbol in Zeile 32. Wenn ich die Zeilen 17 bis 28 weglasse und
Code:
columns[i][3]
direkt
Code:
col.setCellRenderer()
übergebe, dann nörgelt er auch.

Wie mache ich es richtig?

Java:
Object[][] columns = {
	{ COLUMN_NR,		30,		"Nr",			slcr },
	{ COLUMN_VORNAME,	100,	"Vorname",		slcr },
	{ COLUMN_NAME,		100,	"Name",			slcr },
	{ COLUMN_ALTER,		40,		"Alter",		slcr },
	{ COLUMN_POSITION,	40,		"Pos",			pcr },
	{ COLUMN_ADRESSE, 100,	"Adresse",	mlcr }
};

TableColumn col;
for(int i = 0; i < columns.length; i++) {

	Integer modelIndex	= (Integer) columns[i][0];
	Integer width		= (Integer) columns[i][1];
	String header		= (String) columns[i][2];
	
	if (columns[i][3] instanceof SingleLineCellRenderer) {
		SingleLineCellRenderer renderer = (SingleLineCellRenderer) columns[i][3];
	}
	else if(columns[i][3] instanceof MultiLineCellRenderer) {
		MultiLineCellRenderer renderer = (MultiLineCellRenderer) columns[i][3];
	}
	else if(columns[i][3] instanceof PositionCellRenderer) {
		PositionCellRenderer renderer = (PositionCellRenderer) columns[i][3];
	}
	else {
		DefaultTableCellRenderer  renderer = (DefaultTableCellRenderer ) columns[i][3];
	}

	col = new TableColumn(modelIndex, width);
	col.setHeaderValue(header);
	col.setCellRenderer( renderer );
	
	columnModel.addColumn(col);
}
 
Wie mache ich es richtig?
Java:
Object[][] columns = {
	{ COLUMN_NR,		30,		"Nr",			slcr },
	{ COLUMN_VORNAME,	100,	"Vorname",		slcr },
	{ COLUMN_NAME,		100,	"Name",			slcr },
	{ COLUMN_ALTER,		40,		"Alter",		slcr },
	{ COLUMN_POSITION,	40,		"Pos",			pcr },
	{ COLUMN_ADRESSE, 100,	"Adresse",	mlcr }
};

TableColumn col;
for(int i = 0; i < columns.length; i++) {

	Integer modelIndex	= (Integer) columns[i][0];
	Integer width		= (Integer) columns[i][1];
	String header		= (String) columns[i][2];


	TableCellRenderer renderer = null;
	if (columns[i][3] instanceof SingleLineCellRenderer) {
		renderer = (SingleLineCellRenderer) columns[i][3];
	}
	else if(columns[i][3] instanceof MultiLineCellRenderer) {
		renderer = (MultiLineCellRenderer) columns[i][3];
	}
	else if(columns[i][3] instanceof PositionCellRenderer) {
		renderer = (PositionCellRenderer) columns[i][3];
	}
	else {
		renderer = (DefaultTableCellRenderer ) columns[i][3];
	}

	col = new TableColumn(modelIndex, width);
	col.setHeaderValue(header);
	col.setCellRenderer( renderer );
	
	columnModel.addColumn(col);
}
Du musst "renderer" vor deinen Bedinungen deklarieren. Sonst gelten die Variable immer nur in dem jeweiligen Block und er kann sie natürlich später nicht finden.

Warum da überhaupt castest und unterscheidest versteh ich aber nicht. Warum nicht so:
Java:
Object[][] columns = {
	{ COLUMN_NR,		30,		"Nr",			slcr },
	{ COLUMN_VORNAME,	100,	"Vorname",		slcr },
	{ COLUMN_NAME,		100,	"Name",			slcr },
	{ COLUMN_ALTER,		40,		"Alter",		slcr },
	{ COLUMN_POSITION,	40,		"Pos",			pcr },
	{ COLUMN_ADRESSE, 100,	"Adresse",	mlcr }
};

TableColumn col;
for(int i = 0; i < columns.length; i++) {

	Integer modelIndex	= (Integer) columns[i][0];
	Integer width		= (Integer) columns[i][1];
	String header		= (String) columns[i][2];

	TableCellRenderer renderer = columns[i][3];

	col = new TableColumn(modelIndex, width);
	col.setHeaderValue(header);
	col.setCellRenderer( renderer );
	
	columnModel.addColumn(col);
}

Das ist doch das schöne and dem Interface, oder überseh ich da was?
 
Zuletzt bearbeitet von einem Moderator:
Das ist doch das schöne and dem Interface, oder überseh ich da was?

Nein, du übersiehst nichts. Ich bin nur ein fachfremder Anfänger und habe gerade wieder etwas gelernt. Vielen Dank! 🙂

So geht es:
Java:
TableCellRenderer renderer = (TableCellRenderer) columns[i][3];
 
Statt einem Object[][] würd ich ehrlich gesagt lieber ein EigenesKlasse[] nehmen. Dann sparst du dir das Casten ganz und ist wesentlich übersichtlicher.

Java:
public class Column{
   int modelIndex;
   int width;
   String header;
   TableCellRenderer renderer;

// Constructor, getter und Setter dazu
}

Column[] columns = { new Column(COLUMN_NR,        30,     "Nr",           slcr),
 new Column(COLUMN_VORNAME,   100,    "Vorname",      slcr),
//... usw
}

TableColumn col;
for(Column c : columns) {
 
    Integer modelIndex  = c.getModelIndex();
    Integer width       = c.getWidth();
    String header       = c.getHeader();
 
    TableCellRenderer renderer = c.getTableCellRenderer;
 
    col = new TableColumn(modelIndex, width);
    col.setHeaderValue(header);
    col.setCellRenderer( renderer );

Wesentlich sauberer und ohne casten.
 

Neue Themen


Zurück
Oben