ArrayIndexOutOfBoundsException bei Update von JTable und Model

Darokh

Mitglied
Hi,
ich übe gerade, Daten aus einer mysql Datenbank in einer Tabelle abzubilden, dort dann zu editieren und dann wieder zurück in die Datenbank zu geben.
Das läuft nun auch alles - das einzige Problem ist das Updaten der Tabelle.

Wenn ich die Daten nach der Editierung wieder in das Model überführe und dann in der Tabelle anzeigen lassen möchte, geht das sogar, erhalte dann aber die ArrayIndexOutOfBoundsException -1.

Zwar funktioniert immer noch alles, aber zufrieden bin ich damit nun nicht.


Der Code ist gerade zwar nur zum Training und somit nicht 100% ig optimiert, über Rückmeldung bin ich jedoch trotzdem sehr dankbar.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;

public class TableFromDatabase extends JFrame implements ListSelectionListener {
    	
	private DefaultTableModel model;	
	private final String userName = ***;
	private final String password = ***;
	private String databaseURL = ***;	
	
	private JTable table;	
	private JTextField tf_Vorname;
	private JTextField tf_Nachname;	
	private JCheckBox chkbx_boolean;
	private int selRow;
	private int selCol;
	
	private Class[] types = new Class [] 
			 {
		        String.class, String.class, String.class, Boolean.class
		      };
	
	
	  public static void main(String[] args) 
	  {
		TableFromDatabase frame = new TableFromDatabase();
	  }
	
	
	  	
	  public void loadData()
      {
		  System.out.println("LOADING DATA");
		  Vector <String> columnNames = new Vector<String>();  // die Spaltennamen werden hier gespeichert
	      Vector <Vector> data = new Vector <Vector>();			// datensatz wird gespeichert
	      model = new DefaultTableModel();
	      
      	 try {
               
           	//  Connect to the Database
           	   String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
               Class.forName( driver );
               Connection connection = DriverManager.getConnection(databaseURL, userName, password);
               
               
               //  Read data from a table
               String sql = "Select id_Persons, Vorname, Nachname, BoolTest from tbl_Persons";
               Statement stmt = connection.createStatement();
               ResultSet rs = stmt.executeQuery( sql );
               ResultSetMetaData md = rs.getMetaData();
               int columns = md.getColumnCount();
               
               
               //  Get column names
               for (int i = 1; i <= columns; i++)
               {
                   columnNames.addElement( md.getColumnName(i) ); 
                   System.out.println(md.getColumnName(i));
               }
               //  Get row data
               while (rs.next()) 
               {
                   Vector <Object> row = new Vector<Object>(columns);
                   
                   for (int i = 1; i <= columns; i++)
                   {
                       row.addElement( rs.getObject(i) );
                   }
                   data.addElement( row );
               }
               rs.close();
               stmt.close();   

               model.setDataVector(data, columnNames);
              
               
           } catch(Exception e) 
           {
               System.out.println( e );
           }
      	
           
      }

	  
    public TableFromDatabase() 
    {
    	
    	model = new DefaultTableModel()  
        {
            public Class getColumnClass(int columnIndex) 
            {
                return types [columnIndex];
            }
            
            public boolean isCellEditable( int rowIndex, int columnIndex )
            {
              return false;
            }
                         
        };
        
		setDefaultCloseOperation( EXIT_ON_CLOSE );
		setBounds(100,100,500,500);	   
		
	    getContentPane().setLayout(null);
    	  
	    
    	
        
        loadData();	// lädt daten in model
		
        //  Erstelle Tabelle       
        table = new JTable(model);	// fügt daten zur tabelle hinzu
        JScrollPane scrollPane = new JScrollPane( table );	// tabelle zum Scrollpane hinzufügen
        scrollPane.setBounds(20, 20, 400, 200);
        getContentPane().add( scrollPane ); 	// hinzufügen zum Frame
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        ListSelectionModel selectionModel = table.getSelectionModel();
		selectionModel.addListSelectionListener( this );

   
        
        tf_Vorname = new JTextField();
        tf_Vorname.setBounds(76, 252, 86, 20);
        getContentPane().add(tf_Vorname);
        tf_Vorname.setColumns(10);
        
        tf_Nachname = new JTextField();
        tf_Nachname.setBounds(76, 291, 86, 20);
        getContentPane().add(tf_Nachname);
        tf_Nachname.setColumns(10);
        
        chkbx_boolean = new JCheckBox("New check box");
        chkbx_boolean.setBounds(76, 331, 97, 23);        
        getContentPane().add(chkbx_boolean);
        
        
        
        JButton btn_Save = new JButton("Save");
        btn_Save.addActionListener(new ActionListener() 
        {
        	public void actionPerformed(ActionEvent e) 
        	{
        		try {
                    
                	//  Connect to the Database
                	String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
                    Class.forName( driver );
                    Connection myCon = DriverManager.getConnection(databaseURL, userName, password);
                    
                    String query =  "UPDATE tbl_Persons SET Vorname = '" + tf_Vorname.getText() + "', Nachname = '" + tf_Nachname.getText() + "' WHERE id_Persons = " + model.getValueAt(selRow, 0); 
                    		                    		
                     PreparedStatement stmt = myCon.prepareStatement(query);
                     stmt.executeUpdate();
                     myCon.close();  
                     loadData();                     
                     table.setModel(model); 
        		}
        	  catch(Exception e1) 
        	  {
                 System.out.println( e1 );
             }
        		
        	}
        	
        });
        btn_Save.setBounds(247, 304, 89, 23);
        getContentPane().add(btn_Save);
        setVisible(true);
        
    }
   

	public void valueChanged(ListSelectionEvent e) 
	{
		 if (!e.getValueIsAdjusting()) 
		 { 
			 selRow = table.getSelectedRow();
			 selCol = table.getSelectedColumn();
			 
			 // Show values in textfields
			 tf_Vorname.setText((String) model.getValueAt(selRow, 1));
			 tf_Nachname.setText((String) model.getValueAt(selRow, 2));			 
			 chkbx_boolean.setSelected((Boolean) model.getValueAt(selRow,3));
			 
         }
		
	}
	
}
 
Zuletzt bearbeitet von einem Moderator:
Moin,

was zeigt denn Dein Debugger in der Zeile für model an ?

Ich konnte mir so aus dem Bauch heraus vorstellen, dass das mit dem Laden in loadData() so nicht klappt !
Versuch' mal das model, das Du dort füllst, an die umliegende Variable model zurück zugeben!

Gruß
Klaus
 
Also als Identifier:
[id_Persons, Vorname, Nachname, BoolTest]

dataVector:
[[1, Brigitte, Rasaa, true], [2, Clara, Reer, true], [3, Ulli, Schale, false], [4, Patrick, Brand, true]]


listener:
EventListenerList: 0 listeners:

Danach gibt er mir dann die Fehlermeldung...


Deinen Vorschlag verstehe ich leider nicht so ganz 🙁
 
gibt es einen genauen StackTrace?
zu Beginn des Konstruktors wird ein überschiebenes DefaultTableModel erstellt, das ist komplett sinnlos,

allgemein ein schönes Beispiel für verkorste Ineinandermischung von GUI und Datenbankcode,
niemand kann das Programm testen,
würdest du den Datenbank-Code in eigene Klassen auslagern, die simple Daten wie String[][] oder evtl. ausnahmsweise gar fertige DefaultTableModel zurückgeben,
könntest du hier den DB-Code völlig ausklammern und durch Dummy-Daten ersetzen,

ich habe das testweise gemacht, bei mir tritt aber kein Fehler auf,
ach und Debugger sind immer zu misstrauen wenn sie den Programmfluss anhalten und wer weiß was alles,
lasse deine Programme normal laufen, was spricht dagegen dort auf die Exception zu warten?
ein kompletter StackTracee könnte noch Informationen enthalten

in der Zeile
> table.setModel(model)
kann unmöglich eine ArrayIndexOutOfBoundsException auftreten,
intern vielleicht, wenn auch unwahrscheinlich, aber das sollte dann der StackTrace genau zeigen,

Java:
  } catch(Exception e) 
           {
               System.out.println( e );
           }
statt e.printStackTrace() ist natürlich selbsteingebautes völliges Abschneiden von Programminformationen, selbst schuld..
hättest du den DB-Code von der GUI getrennt, hättest du an dieser Stelle wahrscheinlich gar kein catch(Exception),
und dann die bessere automatische Standardausgabe, ein weiterer Vorteil..


(edit: teste jetzt noch mit der Selektion, erweitere auf 4 Spalten + Boolean)

Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        TableFromDatabase frame = new TableFromDatabase();
    }

}


class TableFromDatabase
    extends JFrame
    implements ListSelectionListener
{

    private DefaultTableModel model;

    private JTable table;
    private JTextField tf_Vorname;
    private JTextField tf_Nachname;
    private JCheckBox chkbx_boolean;
    private int selRow;
    private int selCol;

    private Class[] types = new Class[]
        {String.class, String.class, String.class, Boolean.class};


    public static void main(String[] args)
    {
        TableFromDatabase frame = new TableFromDatabase();
    }


    public void loadData()
    {
        System.out.println("LOADING DATA");
        Vector<String> columnNames = new Vector<String>(); // die Spaltennamen werden hier
                                                           // gespeichert
        Vector<Vector> data = new Vector<Vector>(); // datensatz wird gespeichert
        model = new DefaultTableModel();


        // Read data from a table

        String[] col =
            {"a", "b", "c"};
        String[][] dat =
            {
                {"a1", "b1", "c1"},
                {"a2", "b2", "c2"}};
        int columns = col.length;


        // Get column names
        for (int i = 1; i <= columns; i++)
        {
            columnNames.addElement(col[i - 1]);
            System.out.println(col[i - 1]);
        }
        // Get row data
        for (int j = 0; j < dat.length; j++)
        {
            Vector<Object> row = new Vector<Object>(columns);

            for (int i = 1; i <= columns; i++)
            {
                row.addElement(dat[j][i-1]);
            }
            data.addElement(row);
        }
        model.setDataVector(data, columnNames);
    }


    public TableFromDatabase()
    {

        model = new DefaultTableModel()
            {
                public Class getColumnClass(int columnIndex)
                {
                    return types[columnIndex];
                }

                public boolean isCellEditable(int rowIndex, int columnIndex)
                {
                    return false;
                }

            };

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100, 100, 500, 500);

        getContentPane().setLayout(null);


        loadData(); // lädt daten in model

        // Erstelle Tabelle
        table = new JTable(model); // fügt daten zur tabelle hinzu
        JScrollPane scrollPane = new JScrollPane(table); // tabelle zum Scrollpane
                                                         // hinzufügen
        scrollPane.setBounds(20, 20, 400, 200);
        getContentPane().add(scrollPane); // hinzufügen zum Frame
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        ListSelectionModel selectionModel = table.getSelectionModel();
        selectionModel.addListSelectionListener(this);


        tf_Vorname = new JTextField();
        tf_Vorname.setBounds(76, 252, 86, 20);
        getContentPane().add(tf_Vorname);
        tf_Vorname.setColumns(10);

        tf_Nachname = new JTextField();
        tf_Nachname.setBounds(76, 291, 86, 20);
        getContentPane().add(tf_Nachname);
        tf_Nachname.setColumns(10);

        chkbx_boolean = new JCheckBox("New check box");
        chkbx_boolean.setBounds(76, 331, 97, 23);
        getContentPane().add(chkbx_boolean);


        JButton btn_Save = new JButton("Save");
        btn_Save.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    loadData();
                    table.setModel(model);
                }

            });
        btn_Save.setBounds(247, 304, 89, 23);
        getContentPane().add(btn_Save);
        setVisible(true);

    }


    public void valueChanged(ListSelectionEvent e)
    {
        if (!e.getValueIsAdjusting())
        {
            selRow = table.getSelectedRow();
            selCol = table.getSelectedColumn();

            // Show values in textfields
            tf_Vorname.setText((String)model.getValueAt(selRow, 1));
            tf_Nachname.setText((String)model.getValueAt(selRow, 2));
            chkbx_boolean.setSelected((Boolean)model.getValueAt(selRow, 3));

        }

    }

}
 
Zuletzt bearbeitet von einem Moderator:
ok, war dann doch nicht so wild:
beim Neuladen verschwindet die Selektion, valueChanged arbeitet mit Selektions-Index -1
am StackTrace eigentlich schon jetzt locker zu erkennen:
Code:
	at java.util.Vector.elementAt(Unknown Source)
	at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
	at test.TableFromDatabase.valueChanged(Test.java:179)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
	at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(Unknown Source)
	at javax.swing.JTable.clearSelectionAndLeadAnchor(Unknown Source)
	at javax.swing.JTable.tableChanged(Unknown Source)
	at javax.swing.JTable.setModel(Unknown Source)
	at test.TableFromDatabase$2.actionPerformed(Test.java:160)
...
der setModel() ist gewiss beteiligt, aber davor doch noch ne Menge mehr
 
Hm, ich hab nun sehr viel rumgeschaut...aber eine wirkliche Lösung habe ich bisher noch nicht gefunden.
Hat jemand noch eine Idee? :/


Ich habe mal versucht, die Verbesserungsvorschläge umzusetzen. Ich hoffe, das hier ist besser.
- Habe die DB Geschichte nun ausgelagert
- fillModel Methode angelegt, mit der nun das Model befüllt wird.
- generell mal die Übersicht verbessert...glaube ich.

Was ich noch nicht verstanden habe ist die Sache mit dem DefaultTableModel und dem unnötigen Erstellen / Überschreiben.




Java:
/*
 * TableFromDatabase.java
 */
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;

public class TableFromDatabase extends JFrame implements ListSelectionListener {
    	
	private DefaultTableModel model;	
	
	private JTable table;	
	private JTextField tf_Vorname;
	private JTextField tf_Nachname;	
	private JCheckBox chkbx_boolean;
	private int selRow;
	private int selCol;
	
	private DBConnection myCon = new DBConnection();
	
	private Class[] types = new Class [] 
			 {
		        String.class, String.class, String.class, Boolean.class
		      };
	
	  	

	  
    public TableFromDatabase() 
    {
    	
    	model = new DefaultTableModel()  
        {
            public Class getColumnClass(int columnIndex) 
            {
                return types [columnIndex];
            }
            
            public boolean isCellEditable( int rowIndex, int columnIndex )
            {
              return false;
            }
                         
        };
        		
    	  
	    
    	
        
        loadData();	// lädt daten in model
		
        //  Erstelle Tabelle       
        table = new JTable(model);	// fügt daten zur tabelle hinzu
        JScrollPane scrollPane = new JScrollPane( table );	// tabelle zum Scrollpane hinzufügen
        scrollPane.setBounds(20, 20, 400, 200);
        this.getContentPane().add( scrollPane ); 	// hinzufügen zum Frame
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
        ListSelectionModel selectionModel = table.getSelectionModel();
		selectionModel.addListSelectionListener( this );

   
        
        tf_Vorname = new JTextField();
        tf_Vorname.setBounds(76, 252, 86, 20);
        getContentPane().add(tf_Vorname);
        tf_Vorname.setColumns(10);
        
        tf_Nachname = new JTextField();
        tf_Nachname.setBounds(76, 291, 86, 20);
        getContentPane().add(tf_Nachname);
        tf_Nachname.setColumns(10);
        
        chkbx_boolean = new JCheckBox("New check box");
        chkbx_boolean.setBounds(76, 331, 97, 23);        
        getContentPane().add(chkbx_boolean);
        
        
        
        JButton btn_Save = new JButton("Save");
        btn_Save.setBounds(247, 304, 89, 23);
        btn_Save.addActionListener(new ActionListener() 
        {
        	public void actionPerformed(ActionEvent e) 
        	{
        	
        		myCon.updateDB("UPDATE tbl_Persons SET Vorname = '" + tf_Vorname.getText() + "', Nachname = '" + tf_Nachname.getText() + "' WHERE id_Persons = " + model.getValueAt(selRow, 0));
        		
        		loadData();       		
        		
                table.setModel(model);
        		
        	}
        		
        		
        	
        });
               
        
        this.getContentPane().add(btn_Save);        
        this.setDefaultCloseOperation( EXIT_ON_CLOSE );
		this.setBounds(100,100,500,500);			
	    this.getContentPane().setLayout(null);
        this.setVisible(true);
        
    }
    
    
    public DefaultTableModel loadData()
    {
		  System.out.println("LOADING DATA");
		  Vector <String> columnNames = new Vector<String>();  // die Spaltennamen werden hier gespeichert
	      Vector <Vector> data = new Vector <Vector>();			// datensatz wird gespeichert
	      //model = new DefaultTableModel();
	      
    	 try {
    		 
    		 ResultSet rs = myCon.returnQuery("Select id_Persons, Vorname, Nachname, BoolTest from tbl_Persons");
             ResultSetMetaData md = rs.getMetaData();
             int columns = md.getColumnCount();
             
             
             //  Get column names
             for (int i = 1; i <= columns; i++)
             {
                 columnNames.addElement( md.getColumnName(i) ); 
                 System.out.println(md.getColumnName(i));
             }
             //  Get row data
             while (rs.next()) 
             {
                 Vector <Object> row = new Vector<Object>(columns);
                 
                 for (int i = 1; i <= columns; i++)
                 {
                     row.addElement( rs.getObject(i) );
                 }
                 data.addElement( row );
             }          

             fillModel(data, columnNames);
            
             
         } catch(Exception e) 
         {
      	   e.printStackTrace();
         }
		return model;
    	
         
    }
    
    public void fillModel(Vector<Vector> data, Vector <String> columnNames)
    {
    	model.setDataVector(data, columnNames);
    }
    

	public void valueChanged(ListSelectionEvent e) 
	{
		 if (!e.getValueIsAdjusting()) 
		 { 
			 selRow = table.getSelectedRow();
			 selCol = table.getSelectedColumn();
			 
			 // Show values in textfields
			 tf_Vorname.setText((String) model.getValueAt(selRow, 1));
			 tf_Nachname.setText((String) model.getValueAt(selRow, 2));			 
			 chkbx_boolean.setSelected((Boolean) model.getValueAt(selRow,3));
			 
         }
		
	}
	
}
 
Zuletzt bearbeitet:
JAVA-Tags statt CODE-Tags !

was gibt es beim überschriebenen Model nicht zu verstehen?
die Zeilen
Java:
    	model = new DefaultTableModel()  
        {
            public Class getColumnClass(int columnIndex) 
            {
                return types [columnIndex];
            }
            
            public boolean isCellEditable( int rowIndex, int columnIndex )
            {
              return false;
            }
                         
        };
kannst du schlicht streichen, später wird doch noch ein neues model erstellt, welchen Zweck haben deiner Ansicht nach diese Zeilen?
das types-Array fällt im Moment auch weg, bzw. ist vielleicht ganz gut aber nicht eingebunden

edit:
mit nun auskommentierten
//model = new DefaultTableModel();
später mag vielleicht wieder alles sinnvoll sein

------

hattest du mein letztes Posting gelesen?
wie gesagt ist der Fehler letztlich minimal, so sehe ich es zumindest im Moment,
du musst nur in der valueChanged(ListSelectionEvent e) darauf achten, bei selRow -1 keinen Mist zu machen,
dürfte doch klar sein?
 
Vielleicht hab ich das mit dem Überschreiben noch nicht so ganz bzw. falsch verstanden...
Wenn ich das hier rausnehme:

Java:
public Class getColumnClass(int columnIndex) 
            {
                return types [columnIndex];
            }
            
            public boolean isCellEditable( int rowIndex, int columnIndex )
            {
              return false;
            }

Dann sind meine Zellen in der Tabelle editierbar (was ich nicht möchte) und die Boolean Spalte wird mir nicht als Grafik sondern als Text angezeigt. Wie bekomm ich das ohne das Überschreiben hin?

Dein Posting habe ich natürlich gelesen - aber so ganz verstehen tue ich es nicht. Für mich klingt es so, dass da irgendwo ein Fehler drin ist, aber nicht klar ist, wo. Aber er macht auch keine Probleme, somit kann man ihn ja vernachlässig.
Ich lerne die ganze Geschichte ja gerade und würde natürlich mit dem Verfahren, wie ich es hier demonstriere natürlich auch weiter Daten einer DB ändern....wenn da aber immer ein Fehler drin ist, fühle ich mich da aber nicht gerade wohl 😉
 
> Wenn ich das hier rausnehme: [..] Dann sind meine Zellen in der Tabelle editierbar (was ich nicht möchte)
denkst du denn überhaupt nicht mit, liest du nicht alles was ich alles schreibe?

selbstverständlich hat das Überschreiben an sich seinen Sinn,
ich sage doch dass es nichts bringt, weil du später noch ein neues DefaultTableModel erzeugst, das erste komplett überschreibst,
egal wie kompliziert und hilfreich es aufgebaut ist..

inzwischen hast du den Befehl in Zeile 126 des neuen Codes ja auskommentiert, wie ich editiert hatte,
also kein Gemecker von mir mehr dazu

----------

> Für mich klingt es so, dass da irgendwo ein Fehler drin ist, aber nicht klar ist, wo.

auch dazu ist mir unverständlich wie du an meinen teils sehr deutlichen Ausführungen anscheinend vorbeiliest,

beim Neuladen verschwindet die Selektion, valueChanged arbeitet mit Selektions-Index -1
du sagst dass du ein Problem beim Neuladen hast, ich sage dir was beim Neuladen passiert, die Selektion aus der Tabelle verschwindet,
was ist an diesem Punkt unverständlich?

in der Folge kommt valueChanged() dran, das sieht man am StackTrace, das ist ja logisch wenn sich die Selektion ändert,
was ist an diesem Punkt unverständlich?

wie ich es sage, ich es sich aus der Exception und logischen Überlegungen ergibt, ist es nun so dass der Selektions-Index,
selRow, -1 ist,
was ist an diesem Punkt unverständlich?

an dem Punkt habe ich dann aufgehört, dass ein Arrayzugriff mit -1 nicht besonders erfolgreich ist, dürfte klar sein,

wenn du fragen würdest
'was ist denn so schlimm an Index -1 in valueChanged()'
oder
'wieso verschwindet die Selektion beim Neuladen'
oder
'was meinst du mit xy'
oder sonst irgendwas intelligentes in Bezug auf das Programm oder meine Antwort, dann wäre das ja noch halbwegs vorangehend,
aber nur
> Dein Posting habe ich natürlich gelesen - aber so ganz verstehen tue ich es nicht.
> Für mich klingt es so, dass da irgendwo ein Fehler drin ist, aber nicht klar ist, wo.
das bietet ja gar nichts, ganz schön frustrierend erkenntnislos..
 
Ja, du sagst mir, wo der Fehler ist...aber da du, wie du siehst, ich noch nicht wirklich erfahren bin, hilft mir diese Ausführung eben nur teilweise.

Was soll ich nun beispielsweise machen, wenn die Selektion weg ist? Wie kann ich das Problem beheben?
Wie kann ich den Fehler mit der Selektion und dem valueChanged beheben? Das ist ja gerade mein Problem...
Mir hilft es jetzt zu Beginn nicht zu wissen, was der Fehler ist, sondern brauche auch irgendwie eine Idee davon, wie ich ihn weg bekomme...unabhängig davon, ob er nun schwerwiegend ist oder nicht. Irgendetwas läuft da ja nicht rund und ich habe es noch nicht ganz verstanden.


Anyway:
- Was für Auswirkungen hat es, wenn die Selektion weg ist?
- Warum nur beim Neuladen und nicht bei der ersten Ausführung - beide werden doch genau gleich ausgeführt.
- Muss Index -1 in valueChanged() irgendwo zurückgesetzt werden?
- wie sollte ich anstelle dessen das defaulttablemodel mit den gewünschen Funktionen einbauen, so dass ich es nicht im Nachhinein überschreibe?
 
Zuletzt bearbeitet:
tja, mit diesem Frage wäre wie gesagt mehr geholfen, obwohl die Antwort darauf denkbar einfach ist und inzwischen schon geschrieben:
mit Index -1 kannst du nicht auf die Arrays zugreichen, das musst du mit if unterscheiden und dann z.B. die Textfelder leeren oder
'keine Selektion' reinschreiben, was immer nach deinem Wunsch in dieser Situation passieren soll,
jedenfalls nicht aufs Array/ aufs Model zugreifen, das gibt offensichtlich Exception
 
Der Vollständigkeit halber, hier meine Lösung, die nun auch funktioniert.
Vielen Dank.


[Java]

public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting())
{

selRow = table.getSelectedRow();
selCol = table.getSelectedColumn();
if (selRow >= 0)
{
// Show values in textfields
tf_Vorname.setText((String) model.getValueAt(selRow, 1));
tf_Nachname.setText((String) model.getValueAt(selRow, 2));
chkbx_boolean.setSelected((Boolean) model.getValueAt(selRow,3));
}

}

}
[/code]
 

Zurück
Oben