# MultiLineTable



## mathon (7. Apr 2005)

Hallo,

Ich verwende eine MultiLineTable als JTable damit ich den Text schöner in meinen Zellen anzeigen kann. Ich verwende dafür drei Klassen die im Netz verfügbar sind und über dieses Forum erhalten habe. Es funktioniert alles einwandfrei außer das Löschen der jeweils letzten Zeile der Table.  

Ich bekomme immer eine ArrayIndexOutOfBoundsException wenn ich versuche die letzte Zeile der JTable zu löschen. Das Löschen aller anderen Zeilen funktioniert einwandfrei. Ich verwende neben dem Löschen in der Datenbank eben den folgenden Ausdruck: model.removeRow(int index); Der Fehler wird immmer in dieser MultiLineTable Klasse in der getRowHeight Methode in dieser Zeile angezeigt:

height = Math.max(height, getHeight((String) tm.getValueAt(row,i), colWidth));

Ich weiß, dass ist so sehr schwer zu sagen, aber vielleicht kennt jemand die Klassen hat sie schon verwendet oder hatte mal ein ähnliches problem...? 

lg
mat


----------



## Wildcard (7. Apr 2005)

Zeig mal die Schleife in der das steht!
Du kommst mit 'i' oder 'row' über den Bereich des Models hinaus...


----------



## mathon (7. Apr 2005)

Hallo,

Ich hoffe, ich darf diesen Code publizieren, aber es ist ja nur ein Teil. Das ist diese getRowHeight Methode wo immer diese ArrayIndexOutOfBoundsException geworfen wird:

public int getRowHeight(int row) 
	{
		int numCols = getColumnCount();
		TableModel tm = getModel();
		// Die nächste auskommentierte Zeile verursachte einen Fehler und
		// wurde deshalb herausgenommen und durch die übernächste Zeile ersetzt.
		//int fontHeight = getFontMetrics(getFont()).getHeight();
		int fontHeight = 12;
		int height = fontHeight;
		Enumeration cols = getColumnModel().getColumns();
		int i = 0;
		while (cols.hasMoreElements()) {
			TableColumn col = (TableColumn) cols.nextElement();
			TableCellRenderer tcr = col.getCellRenderer();
			// without the revalidate hack above, the call th getWidth does not give the
			// right value at the right time. Take out the revalidate and uncomment the
			// next line to see for your self. If you find a way to do it right, drop me
			// a mail please! 
			// System.out.println(col.getWidth());
			int colWidth = col.getWidth();

			if (tcr instanceof MultiLineCellRenderer) {
				height = Math.max(height, getHeight((String) tm.getValueAt(row, i), colWidth));
			}
			i++;
		}
		return height;
	}

Ich bin echt schon am verzweifeln, da ich den Fehler einfach nicht finde. 

lg


----------



## Wildcard (7. Apr 2005)

Das ist code aus der Klasse die du runtergeladen hast?
Dann übergibst du eine row-number die nicht existiert. So einfach ist das  :wink:


----------



## mathon (7. Apr 2005)

Jap, naja bei der removeRow Methode gebe ich aber immer einfach den Index der selektieren Zeile an...mir ist einfach unbegreiflich warum hier ein Fehler auftritt...?


----------



## Wildcard (7. Apr 2005)

mathon hat gesagt.:
			
		

> Jap, naja bei der removeRow Methode gebe ich aber immer einfach den Index der selektieren Zeile an...mir ist einfach unbegreiflich warum hier ein Fehler auftritt...?


Fängst du auch bei 0 zu zählen an? Was steht in der Exception?


----------



## mathon (7. Apr 2005)

Ja habe extra nachgesehen, welche Exception meinst du? es kommt wie gesagt eine ArrayIndexOutOfBounds-Exception.

HIer ist der output dazu:

ava.lang.ArrayIndexOutOfBoundsException: 2 >= 2
	at java.util.Vector.elementAt(Unknown Source)
	at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
	at MultiLineTable.getRowHeight(MultiLineTable.java:189)
	at MultiLineTable.getCellRect(MultiLineTable.java:203)
	at MultiLineTable.valueChanged(MultiLineTable.java:243)
	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.removeIndexInterval(Unknown Source)
	at javax.swing.JTable.tableRowsDeleted(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
	at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(Unknown Source)
	at javax.swing.table.DefaultTableModel.removeRow(Unknown Source)
	at Search.button4_MouseClicked(Search.java:585)
	at Search$SymMouse.mouseClicked(Search.java:329)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.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.pumpOneEventForHierarchy(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)

Hilft dir das?


----------



## Wildcard (7. Apr 2005)

> ava.lang.ArrayIndexOutOfBoundsException: 2 >= 2


Also: du gibst 2 rein, und die Tabelle hat wohl nur 2 Zeilen -> exception


----------



## mathon (7. Apr 2005)

Ja aber ist es nicht eigenartig, dass es beim Löschen aller Zeilen passt nur beim Löschen der letzten Zeile anders ist? Und ich habe mir alle for-Schleifen angesehen, fange immer bei 0 zu zählen an...vielleicht ist irgendwie diese MultiLineTable mit dem DefaultTableModel nicht kompatibel...


----------



## Wildcard (7. Apr 2005)

zeig mir bitte mal deine for-schleife(die bei der der Fehler passiert)


----------



## mathon (7. Apr 2005)

Okay hier ist die Mouse_Clicked event Methode:

// DELETE
void button4_MouseClicked(java.awt.event.MouseEvent event)
{
	int row = table.getSelectedRow();

	borderPanel1.setVisible(false);
	statusBar1.setVisible(true);
	try {
	    statusBar1.setString("Deleting ...please wait!");
	}
	catch (Exception e){
	    System.out.println(e.getMessage());
	}
	int num = n[row]; // textNr to delete
	boolean code  = indication.deleteRow(num);
	System.out.println(code);
	borderPanel1.setVisible(true);
	statusBar1.setVisible(false);
	model.removeRow(row);
}

Und die deleteRow Methode in der Indication Klasse:

public boolean deleteRow (int num)
{
    	PreparedStatement pstmt,pstmt1,pstmt2;
	Connect c = new Connect();
	Connect c1 = new Connect();
	Connect c2 = new Connect();

	// delete selected row in DB
	query = "SELECT wordNr FROM tblTextWord WHERE textNr = "+ num +" ";

	c1.dbAccess(query,false);
	try {
	 pstmt=c.con.prepareStatement("DELETE FROM tblTextWord WHERE textNr = ? AND wordNr = ? ");
	 pstmt1=c.con.prepareStatement("SELECT wordNr FROM tblTextWord WHERE wordNr = ? ");
	 pstmt2=c2.con.prepareStatement("DELETE wordNr FROM tblWord WHERE wordNr = ? ");
	 int i=0;
	 while (c1.rs.next())
	         {
	            i++;
	            int nr = c1.rs.getInt(1);
	        try {
	            pstmt.setInt(1,num);
	            pstmt.setInt(2,nr);
	            c.preparedAccess(pstmt,true);
                            pstmt1.setInt(1,nr);
	            c.preparedAccess(pstmt1,false);
	            if (!(c.rs.next())) // word not in another text
	           {

                                   try {
		                pstmt2.setInt(1,nr);
		                c2.preparedAccess(pstmt2,true);
		            }
		            catch (Exception e) 
                                            {
		                System.out.println(e.getMessage());
		            }
	            }
	            c.rs.close();
	         }
                         catch (Exception e) {
		       System.out.println(e.getMessage());
		    }

	         }  //end while
	         try {
			    pstmt.close();
			    pstmt1.close();
			    pstmt2.close();
			 }
			 catch (Exception e) {
			    System.out.println(e.getMessage());
			    return false;
			 }
			 c1.rs.close();

		}
		catch (Exception e)
		{
			 System.out.println("Error on deleting!");
			 System.out.println(e.getMessage());
			 return false;
	    }
	    query ="DELETE FROM tblText WHERE textNr = "+ num +" ";
		c.dbAccess(query,true);
		return true;
    }


Ich weiß der Code ist etwas wirr geschrieben, aber der kommt nicht von mir, da es meine Aufgabe ist dieses Programm zu warten bzw. weiterzuentwickeln. Aber der Fehler tritt erst auf, seit ich die MultiLineTable verwende.

Siehst du da was?

lg


----------



## mathon (7. Apr 2005)

versteh nicht, warum er die Einrückungen im Posting nicht macht.



Ja und table ist ein Objekt von MultiLineTable, model ist ein Obekt von DefaultTableModel, die num, die ich der deleteRow methode übergebe ist die eindeutige markierung der zeile in der datenbank


----------



## Wildcard (7. Apr 2005)

```
int num = n[row]; // textNr to delete
```
Was ist das hier?
BTW: das einrücken geht so:
"["code"]"blupp"["/code"]"


----------



## mathon (7. Apr 2005)

n ist ein array das zu beginn der Klasse Search in dem das Mouse_Clicked event enthalten ist, definiert wird

int n[] = new int[200];

Es werden hier die Nummern (keys in der Datenbank) der Zeilen gespeichert...


Da ja zuerst bevor ich überhaupt eine Zeile löschen kann die search Methode aufgerufen werden muss damit entsprechende Zeile angezeigt werden, wird zu jeder Zeile in n der eindeutige Key zu der Zeile gespeichert.


----------



## Wildcard (8. Apr 2005)

Probier mal das und sag mir was passiert:


```
int row = table.getSelectedRow(); 
if (row>=model.getRowCount())
{
    System.out.println(row);
    row=model.getRowCount()-1;

}
borderPanel1.setVisible(false); 
statusBar1.setVisible(true); 
try 
{ 
    statusBar1.setString("Deleting ...please wait!"); 
} 
catch (Exception e)
{ 
    System.out.println(e.getMessage()); 
} 
int num = n[row]; // textNr to delete 
boolean code = indication.deleteRow(num); 
System.out.println(code); 
borderPanel1.setVisible(true); 
statusBar1.setVisible(false); 
model.removeRow(row); 
}
```


----------



## mathon (8. Apr 2005)

Ich habe deinen Code ausprobiert, leider noch gleich wie vorher, alle Zeilen lassen sich löschen außer die letzte - es kommt auch wieder die gleiche ArrayIndexOutOfBoundsException.


----------



## Wildcard (8. Apr 2005)

```
if (row>=model.getRowCount()-1) 
{ 
    System.out.println(row); 
    row=model.getRowCount()-1; 

}
```
SRY, hatte das -1 vergessen  :wink:


----------



## mathon (8. Apr 2005)

Geh..., leider noch immer das gleiche - es tritt noch immer der gleiche Fehler auf. Das komische ist ja, dass der Eintrag sowohl aus der Datenbank als auch aus der Tabelle gelöscht wird, jedoch trotzdem diese ArrayIndexOutOfBoundsException auftritt....


----------



## Wildcard (8. Apr 2005)

gab's mal ein sysout oder nicht?


----------



## mathon (8. Apr 2005)

Ja, der Output ist 3 (weil ich die dritte Zeile in der Table gelöscht habe und true, das die Löschung auch in der DB erfolgreich durchgeführt werden konnte)

3
true
java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at MultiLineTable.getRowHeight(MultiLineTable.java:189)
.....


----------



## Wildcard (8. Apr 2005)

```
TableModel tm = getModel();
```
Was ist eigentlich dein TableModel?
Die Zeile ist nicht sehr aussagekräftig  :wink:
Ich brauch etwas mehr code(initialisierung der Table, des Models...)


----------



## mathon (8. Apr 2005)

Meine MultiLineTable table und das DefaultTableModel model sind folgendermaßen definiert:



```
model = new DefaultTableModel(new Object[]{"TextName", "Thesaurus"},0);
			
        
	
        table = new MultiLineTable(model){
         public boolean isCellEditable(int rowIndex, int vColIndex) 
		{
            return false;
        }
		};
        multiLineCR = new MultiLineCellRenderer();
       jvtbl = new JViewport();
       jvtbl.setView(table);
        jvtbl.setPreferredSize(table.getMaximumSize());
        Dimension dim = new Dimension(707, 264);
        table.setFont( new Font("SansSerif", Font.BOLD, fontSize) );
        table.getColumnModel().getColumn(0).setCellRenderer(multiLineCR);
        table.getColumnModel().getColumn(1).setCellRenderer(multiLineCR);
       table.getColumnModel().getColumn(0).setMinWidth(100);
       table.getColumnModel().getColumn(1).setMinWidth(607);
               
        JScrollPane scrollPane = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
       scrollPane.setBounds(13,48,707,264);
        scrollPane.setVisible(true);
        this.getContentPane().add(scrollPane);
```

lg














[/code]


----------



## Wildcard (8. Apr 2005)

Ist mir suspekt was da passiert...
Und mit einer normalen JTable funktionierts?


> Ja, der Output ist 3 (weil ich die dritte Zeile in der Table gelöscht habe und true, das die Löschung auch in der DB erfolgreich durchgeführt werden konnte)
> 
> 3
> true
> ...


Das finde ich auch seltsam, weil da keine ausgabe hätte sein dürfen!
Wie soll den getSelectedRow einen Wert größer als der Inhalt des models liefern?
Kann es sein das durch das multiline keine 1:1 beziehung zwischen table und model mehr besteht, und
zeilennummern für's model übersetzt werden müssen?


----------



## mathon (8. Apr 2005)

Ui, das wäre ja fatal...naja habe jetzt einfach nochmal nur die MultiLineTable durch eine normale JTable ausgetauscht und da ist kein Fehler mehr aufgetreten...aber ich würde halt sogerne diese MultiLineTabel verwenden...

und wie gesagt, wenn ich die MultiLineTable verwenden wird auch die letzte Zeile gelöscht aus der Datenbank und der Table, jedoch kommt trotzdem diese Fehlermeldung


----------



## Wildcard (8. Apr 2005)

Ist jetzt halt schwer was zu sagen ohne die Klasse zu kennen...
Gab's dazu eine doku? hast du einen link o.ä.?


----------



## mathon (8. Apr 2005)

Nein leider, ich habe sie wie gesagt über dieses Forum bekommen und ich weiß nicht ob ich sie weitergeben darf...aber ich glaube, solange sie nicht publiziert werden, geht das in Ordnung. Soll ich dir die Klassen schicken?

lg


----------



## abollm (8. Apr 2005)

mathon hat gesagt.:
			
		

> Nein leider, ich habe sie wie gesagt über dieses Forum bekommen und ich weiß nicht ob ich sie weitergeben darf...aber ich glaube, solange sie nicht publiziert werden, geht das in Ordnung. Soll ich dir die Klassen schicken?
> 
> lg



Schick mir einmal deine ganzen Klassen zu. Meine E-Mail hast du ja. Ich schau mir das gleich einmal an.


----------



## freez (8. Apr 2005)

Hallo, hast du vielleicht die MultiLineTable von Java CodeGuru: http://www.codeguru.com/java/articles/305.shtml?

Wenn ja, ich bekomme auch ne NullPointerException. Allerdings in dem Beispiel, was er angegeben hat. Vielleicht hat es ja auch mit deinem Problem zu tun. Wenn nicht, nix für ungut


----------



## abollm (8. Apr 2005)

freez hat gesagt.:
			
		

> Hallo, hast du vielleicht die MultiLineTable von Java CodeGuru: http://www.codeguru.com/java/articles/305.shtml?
> 
> Wenn ja, ich bekomme auch ne NullPointerException. Allerdings in dem Beispiel, was er angegeben hat. Vielleicht hat es ja auch mit deinem Problem zu tun. Wenn nicht, nix für ungut



Ich glaube, das ist der Code, habe deinen Link jetzt nicht überprüft. Ich hatte aber seinerzeit den Code überarbeitet und eine NullPointerException beseitigt. Ich vermute, dass hier ein anderes Problem vorliegt. Ich schaue mir mathons Code später noch genauer an.


----------



## mathon (10. Apr 2005)

Hallo,

Leider ist noch ein zweites Problem aufgetreten. Das Scrollen in der MultiLineTable funktioniert nur, wenn man den balken anklickt und verschiebt. wenn ich auf den unteren oder oberen Pfeil klicke dann scroll er genau in die verkehrte Richtung. 

Wißt ihr was hier das Problem sein könnte?

lg


----------



## André Uhres (25. Nov 2006)

http://www.javaspecialists.co.za/archive/newsletter.do?issue=106&locale=en_US


----------

