Problem mit JTable Daten-darstellung

kleinfritzchen

Aktives Mitglied
Hallo,
ich hab eine Object vom Typ "Termin" was aus volgenden Elementen besteht:
String,DatTime,DateTime,String.
ich erstelle die Daten für die Tabelle in einem TableModel. Die Methode getValueAt(...) gibt ein Object zurück. Wenn ich im TableModel in der Methode getColumnClass() für diese Spalten die richtigen Class (dh. String.class,DateTime.class,DateTime.class,String) angebe, habe ich das Problem das ich in der Tabelle mir dann die Daten ansehe und dort für die DateTime Spalten die Ausgabe (toString()) aus der DatTime Klasse verwendet wird. Ich benötige aber ein anderes Aussehen des Strings in der Tabelle.
Wie kann ich es anstellen das ich diesen String nur in der Tabelle anders anzeigen kann.
Ein ändern in dem TableModel auf String bringt mir das Problem das nicht mehr der richtige TableCellEditor aufgerufen wird weil der entsprechende Editor ja nach bestimmung der Class ausgewählt wird.
wie kann ich dieses Problem lösen?
 
Hallo, hab ich ja schon überschrieben, es wird aber die toString Methode der DateTime Klasse verwendet weil es sich halt um ein DateTime Object in meiner Termin Klasse handelt. Die toString Methode in der Termin Klasse betrifft nur Daten vom Typ "Termin" aber doch nicht die internen Typen DateTime, oder seh ich das falsch?

Termin Model:
Java:
import java.util.ArrayList;
import java.util.List;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;

public class TerminModel implements TableModel {

	private Liste<Termin> li;
	private List<TableModelListener> tableListener = new ArrayList<TableModelListener>();
	DateTimeFormatter fo = new DateTimeFormatterBuilder()
	.appendDayOfMonth(2).appendLiteral('.').appendMonthOfYear(2)
	.appendLiteral('.').appendYear(4, 4).toFormatter();
	
	// Konstruktor
	public TerminModel(Liste<Termin> tl) {
		this.li = tl;
	}

	public void addTermin(Termin n) {
		li.add(n);
		for (TableModelListener e : tableListener) {
			e.tableChanged(new TableModelEvent(this));
			System.out.println("hier");
		}
	}

	public void removeElement(int index) {
		li.remove(index);
		for (TableModelListener e : tableListener) {
			e.tableChanged(new TableModelEvent(this));
		}
	}

	@Override
	public void addTableModelListener(TableModelListener l) {
		tableListener.add(l);
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return String.class;
		case 1:
			return DateTime.class;
		case 2:
			return DateTime.class;
		case 3:
			return String.class;
		default:
			return null;
		}

	}

	@Override
	public int getColumnCount() {
		return 4;
	}

	@Override
	public String getColumnName(int columnIndex) {
		switch (columnIndex) {
		case 0:
			return "Schichtname";
		case 1:
			return "Start Datum";
		case 2:
			return "End Datum";
		case 3:
			return "Zyklus";
		default:
			return null;
		}
	}

	@Override
	public int getRowCount() {

		return li.getCounter();
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		switch (columnIndex) {
		case 0:
			return li.get(rowIndex).getName();
		case 1:

			return li.get(rowIndex).getStartDatum().toString("dd.MM.YYYY");
			// .toString(
			// new DateTimeFormatterBuilder().appendYear(4, 4)
			// .appendMonthOfYear(2).appendDayOfMonth(2)
			// .toFormatter());

		case 2:
			return li
					.get(rowIndex)
					.getEndDatum()
					.toString(
							new DateTimeFormatterBuilder().appendYear(4, 4)
									.appendMonthOfYear(2).appendDayOfMonth(2)
									.toFormatter());
		case 3:
			return li.get(rowIndex).getWert();
		default:
			return null;
		}
	}

	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return true;
	}

	@Override
	public void removeTableModelListener(TableModelListener l) {
		tableListener.remove(l);

	}

	@Override
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

		
		switch (columnIndex) {
		case 0:
			li.get(rowIndex).setName((String) aValue);
			break;
		case 1: {
			li.get(rowIndex).setStartDatum((DateTime) aValue);// new DateTime(y,
																// m, t, 0, 0));
		}
			break;

		case 2: {
			li.get(rowIndex).setEndDatum((DateTime) aValue);
		}
			break;
		case 3:
			li.get(rowIndex).setWert((String) aValue);
		}
	}

}

Termin Klasse:
Java:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;

public class Termin implements Name{
	private String name;
	private DateTime startDatum;
	private DateTime endDatum;
	private String wert;
	/**
	 * String für Name des Feldes, Start und Enddatum in DateTime format (Joda Time), Wert als Zeichenkette, z.B. Schichtzyklus oder 
	 * Land für Ferienkalender. Alles gekapselt
	 * @param name
	 * @param startDatum
	 * @param endDatum
	 * @param Wert
	 */
	//Konstruktor
	public Termin(String name, DateTime startDatum, DateTime endDatum, String  wert){
		setName(name);
		setStartDatum(startDatum);
		setEndDatum(endDatum);
		setWert(wert);
	}
	public Termin(){
		setName("");
		setStartDatum(new DateTime());
		setEndDatum(startDatum);
		setWert("");
	}
	/**
	 * liefert die laenge des Wert-Parameters
	 * @return
	 */
	public int zykluslaenge(){
		return this.getWert().length();
	}
	
	public char[] werteArray(){
		char[] e=this.wert.toCharArray();
		return e;
	}

	public String getName() {
		return name;
	}
	public String getTeilAlsString(int i){
		switch (i){
		case 0:return this.name;
		case 1:return this.startDatum.toString();
		case 2:return this.endDatum.toString();
		case 3:return this.wert;
		default:return null;
		}
	}

	public void setName(String name) {
		this.name = name;
	}

	public DateTime getStartDatum() {
		return startDatum;
	}

	public void setStartDatum(DateTime startDatum) {
		
		this.startDatum =startDatum;;
	}

	public DateTime getEndDatum() {
		return endDatum;
	}

	public void setEndDatum(DateTime endDatum) {
		this.endDatum = endDatum;
	}

	public String getWert() {
		return wert;
	}

	public void setWert(String wert) {
		this.wert = wert;
	}
	public String startDateToString(){
		DateTimeFormatter fo=new DateTimeFormatterBuilder()
		.appendYear(4, 4)
		.appendMonthOfYear(2)
		.appendDayOfMonth(2)
		.toFormatter();
		return fo.print(startDatum);
	}
	
	public String endDateToString(){
		DateTimeFormatter fo=new DateTimeFormatterBuilder()
		.appendYear(4, 4)
		.appendMonthOfYear(2)
		.appendDayOfMonth(2)
		.toFormatter();
		return name+";"+fo.print(endDatum);
	}
	
	public String dateToString(DateTime t){
		DateTimeFormatter fo=new DateTimeFormatterBuilder()
		.appendYear(4, 4)
		.appendMonthOfYear(2)
		.appendDayOfMonth(2)
		.toFormatter();
		return fo.print(t);
	}
	
	public static String dateToCalendarString(DateTime t){
		DateTimeFormatter fo=new DateTimeFormatterBuilder()
		.appendDayOfMonth(2)
		.appendLiteral('.')
		.appendMonthOfYear(2)
		.appendLiteral('.')
		.appendYear(4, 4)
		.toFormatter();
		return fo.print(t);
	}
	
	@Override
	public String toString(){
		DateTimeFormatter fo=new DateTimeFormatterBuilder()
		.appendYear(4, 4)
		
		.appendMonthOfYear(2)
		.appendDayOfMonth(2)
		.toFormatter();
		return name+";"+fo.print(startDatum)+";"+fo.print(endDatum)+";"+wert;
	}
	public char[] getSchichtZyklus(){
		return wert.toCharArray();
	}
}
 
und hier noch der Editor für DateTime objecte:
Java:
import java.awt.Component;
import java.util.Date;

import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

import org.joda.time.DateTime;

import com.toedter.calendar.JDateChooser;

/**
 * A CellEditor for tables, using a JDateChooser.
 * 
 * @author Kai Toedter
 * @version $LastChangedRevision: 100 $
 * @version $LastChangedDate: 2006-06-04 14:36:06 +0200 (So, 04 Jun 2006) $
 */
public class JDateChooserCellEditor extends AbstractCellEditor implements
		TableCellEditor {

	private static final long serialVersionUID = 917881575221755609L;

	private JDateChooser dateChooser = new JDateChooser();

	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {

		DateTime date = new DateTime();
		System.out.println(value.getClass());
		if (value instanceof String){
			System.out.println("spalte erkannt");
			Date date2 = (Date) value;
			System.out.println(date2);
			}

		dateChooser.setDate(date.toDate());

		return dateChooser;
	}

	public Object getCellEditorValue() {
		return new DateTime(dateChooser.getDate());
	}
}
 
Hier noch eine Änderung (tschuldigung...)
in Zeile 96 des TableModel muss volgender Text:
Java:
return li.get(rowIndex).getStartDatum();
das Liefert ein DateTime Objekt an die Tabelle was aber mit der toString Methode von DateTime abgezeigt.
 
Hier mal die Frage einfach formuliert:
Gibt es eine andere Möglichkeit in einer Tabelle die Daten mit einer speziellen toString Methode anzuzeigen ohne die Datentypen der Spalten zu ändern?
Es geht nicht einfach indem man sagt if (column == 1)) weil die entspechende Tabelle mehrere Tablemodel von unterschiedlichen Datentypen zugewiesen bekommt!
 

Zurück
Oben