Ein Datentyp pro Column (JTable)

Crai

Mitglied
Hallo,

ich hab mich hier mal im Forum umgeschaut und ein bißchen was gefunden, was mir
helfen kann. Nur ist mir das ganze immer noch nicht so klar:
Mein Problem ist eigentlich ganz einfach:
In einem JTable soll eine Spalte nur Integer enthalten dürfen,die nächste etwa nur Strings usw.
Ein Tipps fand ich auch, etwa dass der erste Typ der in eine Spalte eingetragen wird,alle andren in dieser mitbestimmt oder das man die setValueAt(...) Methode des TableModels überschreiben soll. Das ganze ist zwar ein Anfang, aber meiner Meinung nach keine optimale Lösung. Geht das nicht auch einfacher?
Es existiert ja eine getModel().getColumnClass(column) Methode mit der man den aktuellen Typ der Spalte zurück bekommt. Könnte man nun den Typ nicht auch in die Richtung gehend setzen?

Vielen Dank für jeden Tipp,

CU
Crai
 
Hallo Crai,

wenn Du eine neue JTable erzeugst, ohne ein eigenes TableModel zu übergeben, erzeugt die JTable ein DefaultTableModel. Das wiederum erbt von AbstractTableModel. Wenn Du dort die Methode getColumnClass() anschaust, wirst Du feststellen, dass sie immer ein Object.class liefert. Deswegen kann man auch standardmässig beliebiege Werte in eine JTable setzen.

Wenn Du jetzt aber unterschiedliche Datentypen in verschiedenen Spalten haben willst, kommst Du nicht drumherum, ein eigenes TableModel zu schreiben, oder wenigstens das DefaultTableModel zu überschreiben. Das könnte etwa so aussehen:
Code:
TableModel myTableModel = new DefaultTableModel() {
    public Class getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return Integer.class;
            case 1:
                return String.class;
            default:
                return Object.class;
        }
    }
};
JTable myTable = new JTable(myTableModel);

Gruß
Vincent
 
Vielen Dank für deine Hilfe! Funktioniert einwandfrei :)

Nur eine Sache gibt es noch:
Gibt der Benutzer in ner Zelle einen String ein, obwohl ein Integer verlangt ist, reagiert
das Table standardmäßig. Mir gefällt das nicht, denn ich würde da zB. etwa gern nen
MessageDialog ausgeben wollen.
Aber mit dem Überschreiben der setValueAt funktioniert das nicht! (Oder doch)
Hier mal mein eigenes Model:
Code:
public class CustomTableModel extends DefaultTableModel  
{
	public void setValueAt(Object aValue, int row, int column)
	{
		if (!aValue.getClass().equals(this.getColumnClass(column)))
		{
			JOptionPane.showMessageDialog(getJContentPane(),"Falscher Datentyp!");
		}
		else
		{
			super.setValueAt(aValue,row,column);
		}
		//JOptionPane.showMessageDialog(getJContentPane(),table.getModel().getColumnClass(column));
		//JOptionPane.showMessageDialog(getJContentPane(),table.getColumnName(column)); 
	}
	public Class getColumnClass(int columnIndex) 
	{
		switch (columnIndex) 
		{
			case 0:
				return String.class;
			case 1:
				return String.class;
			case 2:
				return Integer.class;
			case 3:
				return Integer.class;
			case 4:
				return Integer.class;
			case 5:
				return String.class;
			case 6:
				return Date.class;
			case 7:
				return String.class;
			default:
				return Object.class;
		}
	}
	public Object getValueAt(int row,int column)
	{
		return super.getValueAt(row,column);
	}
}

CU
Crai
 
Das Problem dabei ist, dass die setValueAt() Methode erst dann aufgerufen wird, wenn der eingegebene Wert auf den Datentyp gecastet werden kann, den die getColumnClass() Methode liefert. Deswegen kommt es gar nicht zu Deiner Überprüfung, wenn Du was "falsches" eingibst. Die betroffene Zelle bekommt dabei einen roten Border, und man kann keine weitere Zellen mehr editieren, solange die falsche Eingabe nicht korrigiert wird. Ich nehme an, darum kümmern sich die Stanard- Renderer und Editor. Also, wenn Du die falsche Eingaben abfangen willst, musst Du Dich dort anhängen. ;)
 
Ok,danke für den Hinweis.
Da ich später meinen eigenen CellRenderer schreiben will, werd ich das mal bis dahin aufschieben,bzw. mit deinen Infos versuch ich des mal selber hinzubekommen...

Vielen Dank dir nochmal,
bei so guten Ratschlägen macht das Programmieren echt Spaß, :)

Gruß
Crai
 

Neue Beiträge

Zurück