Fehler beim einblenden von Tabellenspalten

cyb3rdragon

Mitglied
Hi Leute,

ich hab mal wieder nen komsiches Problem wobei ich nicht weiter komme.
Ich hab mir ein JTable, TableModel und ein Popup dazu gebastelt. Mit dem Popup sollen Spalten ein oder ausgeblendet werden. Das funktioniert eigendlich auch. Aber wenn in der Tabelle eine Zeile markiert ist kommt ein Fehler.
Code:
java.lang.ArrayIndexOutOfBoundsException: 7 >= 7
	at java.util.Vector.elementAt(Unknown Source)
	at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source)
	at javax.swing.JTable.getCellRect(Unknown Source)
	at javax.swing.JTable.valueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
	at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source)
	at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(Unknown Source)
	at javax.swing.DefaultListSelectionModel.clearSelection(Unknown Source)
	at javax.swing.JTable.clearSelection(Unknown Source)
	at javax.swing.JTable.clearSelectionAndLeadAnchor(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableStructureChanged(Unknown Source)
	at util.AdvancedTableModel.setColHidden(AdvancedTableModel.java:245)
	at util.AdvancedTable.setColHidden(AdvancedTable.java:202)
	at util.AdvancedTablePopUp$1.actionPerformed(AdvancedTablePopUp.java:43)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.JToggleButton$ToggleButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Der Fehler (mit dem Wert 7) komt bei 7 bereits sichtbaren Spalten. Ich hab versucht das mit clearSelection() zu lösen, hat aber nicht funktioniert weil dabei scheinbar die Zelle weiterhin markiert bleibt. Wenn nichts markeirt ist läuft das ganze Fehlerfrei.
Außerdem ist während der Fehlermeldung (Fehler wird bei jeder Eingabe neu ausgegeben) andere Zellen zusätzlich markierbar siehe Screenshot.
Ich glaub ich hab alle "Erscheinungen" erwähnt. Noch kurz zu meinem Table. Ist nen bischen länger und komplizierter und schon mehrfach hier im Forum von anderen Leuten in ähnlichen ausführungen gepostet daher lasse ichs erstmal weg. Wenn jemand nen Verdacht hat woran es liegen könnte kann ich natürlich den entsprechenden Code posten.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    39,1 KB · Aufrufe: 24
Du könntest doch mal den Code posten, an dem der Fehler auftritt.
Irgendwo greifst du da auf ein nicht existierendes Vectorfeld zu.
 
Code:
public Object getValueAt (int rowIndex, int columnIndex)
	{
		return formatCol(data.elementAt(getVisibleRow(rowIndex)).elementAt(
				getVisibleCol(columnIndex)), getVisibleCol(columnIndex));
	}

private Object formatCol (Object o, int col)
	{
		if (o != null && !emptyCheck(o.toString()))
		{
			NumberFormat nf;
			switch (columnClasses.elementAt(col)) {
			case AdvancedTable.EUR_COL:
				nf = new DecimalFormat(",### €");
				return nf.format(Integer.parseInt(o.toString()));
			case AdvancedTable.TRUE_FALSE_COL:
				return o.equals("1");
			case AdvancedTable.KM_COL:
				nf = new DecimalFormat(",### KM");
				return nf.format(Integer.parseInt(o.toString()));
			case AdvancedTable.MM_COL:
				nf = new DecimalFormat(",### mm");
				return nf.format(Integer.parseInt(o.toString()));
			case AdvancedTable.KG_COL:
				nf = new DecimalFormat(",### Kg");
				return nf.format(Integer.parseInt(o.toString()));
			case AdvancedTable.DAY_COL:
				return o.toString().substring(8, 10) + "."
						+ o.toString().substring(5, 7) + "."
						+ o.toString().substring(0, 4);
			case AdvancedTable.DATE_COL:
				return o.toString().substring(5, 7) + "."
						+ o.toString().substring(0, 4);
			}
		}
		return o;
	}

private int getVisibleRow (int row)
	{
		int i = getNextNonHiddenRow(0);
		int x = 0;

		while (x != row)
		{
			i = getNextNonHiddenRow(i + 1);
			x++;
		}
		return i;
	}

private int getNextNonHiddenRow (int row)
	{
		while (isRowHidden(row))
			row++;
		return row;
	}

private int getVisibleCol (int col)
	{
		int i = getNextNonHiddenCol(0);
		int x = 0;

		while (x != col)
		{
			i = getNextNonHiddenCol(i + 1);
			x++;
		}
		return i;
	}

private int getNextNonHiddenCol (int col)
	{
		while (isColHidden(col))
			col++;
		return col;
	}

formatCol formatiert die Ausgabe entsprechend den Vorgaben.
getVisible... liefert die interne id damit die ausgeblendeten Spalten/Zeilen nicht angezeigt werden.
getNextNonHidden... dürfte selbterklärend sein.
 
Hier der auszug aus dem ActionListener der den Fehler auslöst bzw. die letzte Benutzereingabe vorm Fehler

Code:
f.setColHidden(f.getColumnID(source), !f.isColHidden(f.getColumnID(source)));

f ist das Table. kp warum ich das f genannt hab.
source enthält den Namen der Spalte
getColumnID liefert die interne Spaltenid. Ausgeblendete Spalten werden also mitgezählt.
setColHidden erwartet die interne ID der Spalte und den neuen Zustand (hidden = true --> spalte ausgeblendet)
wie gesat, das ganze läuft wenn in der Tabelle nichts markiert ist. ich greife in der ganzen Popup Klasse nur an der Stelle auf die Tabelle zu.
 
Wo bekommst du source her? Ich glaube das ist ein ungültiger Wert, der auf ein leeres Feld im Vector für die Tabellendaten verweißt
 
Code:
String source = arg0.getSource().toString();
source = source.substring(source.lastIndexOf("=") + 1,source.length() - 1);
Is vllt nciht die eleganteste variante aber funktioniert. Den Namen bekomme ich aus dem Menüeintrag. Die Einträge werden aus dem gleichen Array erstellt wie die Spaltennamen im Model. Da dürfte also eigendlich kein Fehler sein.
 
Hab ne Lösung gefunden obwohl die glabu ich wenn man ordentlich programmieren will dreck is.
Hab in meinem TableModel das firePropertyChanged() rausgenommen und in die Table gepackt. Da konnte ich dann createDefaultColumnsFromModel() zwischenschieben. Scheinbar hat er irgendwei versucht auf die Spalten zuzugreifen bevor die neu erstellt wurden. Dabei hab ich da eigendlich die Originalmethoden benutzt.
Ist mir aber immer noch ein Rätsel warum der Fehler nur kam wenn eine Zeile markiert war :confused:
 
Zurück