Problem: JTable - Zeile anhängen

sisela

Erfahrenes Mitglied
Ich habe das Problem, dass ich an meiner Tabelle keine weitere Zeile anhängen kann.

Also ich erzeuge eine Tabelle, mit zunächst mit 10 leeren Zeilen. Wenn man auf einen Button "neuer Datensatz" klickt soll eine weitere Zeile hinzugefügt werden.

Ein paar Dinge sind komisch. Z.B. wird die Tabelle überhaupt nicht angezeigt, wenn ich nur das Model beim Erzeugen übergebe. Ich muss "table = new JTable(tmodel.data, tmodel.columnNames);" eingeben, damit sie überhaupt angezeigt wird.
Wenn ich nun auf den Button klicke, bekomme ich immer eine Exception (ganz unten abgebildet).
Weiterhin komisch: ist die Bedingung: "if( table.getModel() instanceof DefaultTableModel )"
denn da kommt das Programm nie rein obwohl dies wahr sein müsste

Vielleicht kann mir ja jemand helfen, stehe z.Z. ziemlich auf dem Schlauch :confused:

Code:
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

class ProductTable {
	private JTable table = null;
	private MyTableModel tmodel = null;
	
	public void createProductTable() {
    	    JPanel panel = new JPanel(new GridLayout(2,1));
    	    JPanel buttonPanel = new JPanel(new FlowLayout());
    	
    	    tmodel = new MyTableModel();
    	    table = new JTable(tmodel.data, tmodel.columnNames);
    	    JScrollPane sp = new JScrollPane(table);
    	
    	    JButton b_newDataset = new JButton("neuer Datensatz");
            b_newDataset.addActionListener(new ButtonListener());
        
            buttonPanel.add(b_newDataset);
        
            panel.add(sp);
            panel.add(buttonPanel);
        
            App.contentPanel.removeAll();
            App.contentPanel.add(panel);
            App.contentPanel.setVisible(true);
        }
    
	
	class MyTableModel extends DefaultTableModel {
		private Object[][] data = null; 
		private String[] columnNames = null;
		
		public MyTableModel() {
			data = StoreApp.dataModel.productData.getProductData();
			columnNames = StoreApp.dataModel.productData.getColumnNames();
		}

		
		public int getRowCount() {
			return StoreApp.dataModel.productData.getProductNumbers();
		}

		public int getColumnCount() {
			return 0;
		}

		public Object getValueAt(int arg0, int arg1) {
			return null;
		}
		
		protected String[] getColumnNames() {
			return columnNames;
		}
		
		protected void setColumnNames(String[] columnNames) {
			this.columnNames = columnNames;
		}
		
		protected Object[][] getData() 	{
			return data;
		}
		
		protected void setData(Object[][] data) {
			this.data = data;
		}
	}
	
    class ButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			
			if (e.getActionCommand() == "neuer Datensatz") {

// hier habe ich diverse Dinge ausprobiert die allerdings alle nicht zur Folge hatten
				tmodel.insertRow(tmodel.getRowCount(), new Object[6]);
				//tmodel.addRow(new Object[6]);
				
				//in diese Schleife kam er nie rein aber wieso?
                                /*
				if( table.getModel() instanceof DefaultTableModel ){
					int cols = table.getModel().getColumnCount();
					table.getModel().addRow(new Object[cols]);
				 }
                                 */
				
				return;
			}
		}
	}
}

|Exception|
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 10 >= 10
 
Moin,
1. Probier mal table = new JTable(tmodel); anstelle von table = new JTable(tmodel.data, tmodel.columnNames);
2. Für solches Design: return StoreApp.dataModel.productData.getProductNumbers(); gehört Dir symbolisch auf die Finger gehauen! ;)
 
Hi,
dass ist ja auch ein Problem, dass ich das TableModel komischerweise nicht einfach so beim erzeugen übergeben kann, denn dann wird überhaupt keine Tabelle angezeigt.

PS.: Ich gebe zu, die rowCounts kann man auch leichter bestimmen :)

Aber wieso kann ich keine Zeile anfügen? Ich frage mich, ob das Model überhaupt wirklich als Model funktioniert?

Aber keine Ahnung...
 
Moin,
das tut es definitiv, vermutlich tausende Java-Programmierer werden Dir das bestätigen können. :)
-> rowCounts: Mir geht es nicht um die Einfachheit der Bestimmung, sondern um den verketteten Zugriff über public-Variablen
-> Keine Anzeige: Die wichtigste Methode des TableModel, getValueAt(), hast Du nicht implementiert. Schau Dir bitte ein paar Beispiele hier im Forum oder in einem der beiden guten Java-Bücher an, damit Du besser verstehst, wie Tabellen implementiert werden und der Aufbau auch von Swing Komponenten generell funktioniert. Ein gutes Buch dazu ist von O'Reilly "Java Swing".
getColumnCount mit return 0 zu verarzten ist auch eher unglücklich, besser wäre z.B. columnNames.length. Aber wie gesagt, bitte erst die Grundlagen lesen, verstehen, dann anwenden.
 
Hallo

ich brauch in etwa dasselbe.

Ich habe eine DB aus der die Daten gelesen werden und nun frage ich mich gibt es nicht einen Befehl wie den

resultTable.addColumn()

nur eben für Zeilen?
 
Gibt es doch, zumindest wenn du mit dem DefaulttableModel arbeitest..
Code:
DefaultTableModel m = (DefaultTableModel)resultTable.getModel();
m.addRow(Object[] row); //oder 
m.addRow(Vector row);
mfg

//edit:
Solltest du die neue Zeile an einer bestimmten stelle benoetigen, musst du anstelle von addRow, insertRow(int row, Object[] rowdata) benutzen....
 
Zuletzt bearbeitet:
Ich habs mal abgetippt aber er brint mir zwei fehlermeldungen

1. m.addRow(Object[] row) --> missplaced constructors
2. m.addRow(Vector row) --> error on token "row", remove this token

bestimmt mach ich was falsch, ich habe nämlich nicht soviel Übung in Java und kenn mich nicht gut aus.

kannst du mir mal n Musterbeispiel posten wo du ne Zelle hinzufügst?

Vielen Dank im Vorraus Rmi
 
aber wie muss ich Object[] row oder Object[] rowdata deklarieren?
 
Zuletzt bearbeitet:
Habs herausen

1. resultTable = new JTable(new DefaultTableModel(rowData, columHeaders));

dann später kommt

DefaultTableModel m = (DefaultTableModel) resultTable.getModel();
m.insertRow(resultTable.getRowCount, new Object[6]);

Danke an alle
 
Zurück