MultiLineTable

Status
Nicht offen für weitere Antworten.

mathon

Bekanntes Mitglied
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

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

mathon

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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?
 

mathon

Bekanntes Mitglied
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...
 

mathon

Bekanntes Mitglied
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

Bekanntes Mitglied
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

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

mathon

Bekanntes Mitglied
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

Top Contributor
Probier mal das und sag mir was passiert:

Code:
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

Bekanntes Mitglied
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

Top Contributor
Code:
if (row>=model.getRowCount()-1) 
{ 
    System.out.println(row); 
    row=model.getRowCount()-1; 

}
SRY, hatte das -1 vergessen :wink:
 

mathon

Bekanntes Mitglied
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....:(
 

mathon

Bekanntes Mitglied
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

Top Contributor
Code:
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

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


Code:
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

Top Contributor
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
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)
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

Bekanntes Mitglied
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

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

mathon

Bekanntes Mitglied
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

Top Contributor
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.
 

abollm

Top Contributor
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

Bekanntes Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben