DefaultTableModel .add

Hi,
ich sitze ja heute schon den ganzen Abend an JTable, mit Arrays hat soweit auch alles geklappt,
und jetzt habe ich mich mal an DefaultTableModel rangetraut.
Ich habe ehrlich gesagt vorher noch nie was mit Vector gemacht, aber hier benötige ich die klasse ja anscheinend.
Erstmal mein Code. (diesmal ist er noch nicht fertig, da ich aufgrund des Fehlers nicht weiter komme, und es auch schon spät ist)

Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel; //mit DefaultTableModel
import java.util.Vector;

public class versuch3 extends JFrame 
{
/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
Container c;
//JPanel jpcenter;
JPanel jpsouth;
JButton alleObjekteButton;
JButton gefundendeObjekteButton;
JButton neueZeile;
JButton speichern;
String zeile;
String [] dataZeile = new String [5];
String [][]data = new String [100][5];
int i = 0;
int j = 0;
//tabel
JTable tabelle;
JScrollPane scrollPane;
String[] title = new String[]{
		"Name", "Ort", "Nummer", "Barcode"};
Vector vector = new Vector( 3 );

	public versuch3()
	{	final DefaultTableModel model = new DefaultTableModel( title, 0 );       //mit DefaultTableModel
		JTable tabelle = new JTable(model);										//mit DefaultTableModel
		
		c = getContentPane();
		jpsouth = new JPanel(new GridLayout(1,4));
		//erster button
		alleObjekteButton = new JButton("Alle Objekte anzeigen");
		jpsouth.add(alleObjekteButton);
		alleObjekteButtonListenerklasse obL = new alleObjekteButtonListenerklasse();
		alleObjekteButton.addActionListener(obL);
		//zweiter button
		gefundendeObjekteButton = new JButton("Gefundende Objekte anzeigen");
		jpsouth.add(gefundendeObjekteButton);
		//dritter Button
		neueZeile = new JButton("neue Zeile");
		jpsouth.add(neueZeile);
		//vierter Button
		speichern = new JButton("Speichern");
		jpsouth.add(speichern);
		//tabel hinuzufügen
	    //erst im Listener :(
		 
		    
		c.add(jpsouth, BorderLayout.SOUTH);	
		}
			
		class alleObjekteButtonListenerklasse implements ActionListener
		{
				public void actionPerformed(ActionEvent e) {
				    try{
				    	FileReader fr = new FileReader("texttabelle.txt");
				        BufferedReader br = new BufferedReader(fr);
				      
				        while( (zeile = br.readLine()) != null )
				        	{
				        	String []dataZeile  = zeile.split(";");
				        	//Keine Ahnung ob richtig
				        	for(i =0; i >=4; i++)
				        	{vector.add("dataZeile[i]");}
				        	// add oder addElement ? vector.addElement("dataZeile[i]");}
				        		
				        	model.addRow(vector);
				        	}
				        	br.close();
				    	}
				     	catch(IOException ex) {
				        //do nothing
				    }
				    //Daten in Tabelle schreiben
				    JTable tabelle = new JTable( data, title );
				    c.add( new JScrollPane( tabelle ),BorderLayout.CENTER);
				    c.validate();
				    //jpcenter.add(new JLabel(zeile));
				    
				}}
	public static void main (String []args)
	{
		versuch3 fenster = new versuch3();
		
		fenster.setTitle("RFID Finder Tabellenansicht");
		fenster.setSize(900,700);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}	
}

Hier noch der Inhalt der txt datei
1.1;1.2;1.3;1.4
2.1;2.2;2.3;2.4
3.1;3.2;3.3;3.4
4.1;4.2;4.3;4.4
5.1;5.2;5.3;5.4
6.1;6.2;6.3;6.4

Was habe ich mir gedacht:
Ich habe das gleiche vorher schon mit arrays geschrieben, allerdings würde ich gerne auch neue Zeilen hinzufügen können.
Deswegen wollte ich einen Button machen "alleObjekteButton", der erstmal alles aus der txt raushohlt und die Tabelle aufmacht, und einen Button, der leere zeilen hinzufügt.

Hier liegt der Hund begraben (Zeile 79)
Java:
while( (zeile = br.readLine()) != null )
{
String []dataZeile  = zeile.split(";");

for(i =0; i >=4; i++)
{vector.add("dataZeile[i]");}
// add oder addElement ? vector.addElement("dataZeile[i]");}
				        		
model.addRow(vector);
}

model müsste ja eigentlich addRow "können" trotzdem wird mir ein Fehler angezeigt:(
Desweiteren weiß ich nicht, ob mit dem Vector vector alles glatt läuft.
Ich hohle die daten aus der txt erst in einen String.
Splitte dann den String(Zeile) auf in 4 Teile und speicher es in ein Array.
(Bis hier sollte er klappen)
Und dann übergebe ich den Inhalt vom Array in den Vector. Das habe ich so noch nie gemacht und den Code dafür aus dem web. Ist das so richtig?
Das sind meine Idee, woran es liegen könnte.
Wie immer, Danke für eure Hilfe im Voraus. :D
 
Zuletzt bearbeitet:

TKausL

Top Contributor
Java:
DefaultTableModel model = new DefaultTableModel(); 
model.addRow(new Vector());

Funktioniert bei mir einwandfrei.

Vieleicht guckst du mal nach, welcher Fehler dir angezeigt wird...

BTW: Wenn der eine Fehler beseitigt ist werden dir noch mehrere andere begegnen. Hab ich beim drüberfliegen nur so festgestellt.

Wenn ich das:
Java:
for(i =0; i >=4; i++)
{vector.add("dataZeile[i]");}

schon sehe, solltest du nochmal ganz von vorne bei den Grundlagen anfangen bevor du GUI-Programmierung machst.

[EDIT]Außerdem brauchst du auch die Tabelle nicht neu zu befüllen wenn du ein TableModel nutzt, und erstrecht brauchst du nicht jedesmal eine neue Tabelle erstellen

E2: Die ganze actionPerformed ist murks.
Du addest dem Vector nicht den inhalt des Arrays sondern jedesmal den gleichen String
Du resettest den Vector nicht nach jedem durchlauf
Du schließt die Datei IN der Schleife
Und das beste: Du erstellst eine neue Tabelle + ScrollPane, addest sie, lässt die alte wo sie ist und hast irgendwann 20 Tabellen in deinem Frame.
Und wenn du in Eclipse bist nutz doch bitte ab und zu mal STRG+SHIFT+F, mir tun schon meine Augen weh...
[/EDIT]
 
Zuletzt bearbeitet:
Funktioniert bei mir einwandfrei.

Ja, ich weiß das es einwandfrei funktioniert.
Deswegen frage ich ja nach, ob jemand weiß, warum es bei mir nicht einwandfrei funktioniert.

BTW: Wenn der eine Fehler beseitigt ist werden dir noch mehrere andere begegnen. Hab ich beim drüberfliegen nur so festgestellt.
Beim überfliegen? Das ist doch genau die Zeilen, wo ich explizit dazu geschrieben habe, das ich nicht weiß, ob das mit dem Vector so richtig ist. Ich habe es sogar am Ende nochmal zitiert.

Außerdem brauchst du auch die Tabelle nicht neu zu befüllen wenn du ein TableModel nutzt, und erstrecht brauchst du nicht jedesmal eine neue Tabelle erstellen
Und das beste: Du erstellst eine neue Tabelle + ScrollPane, addest sie, lässt die alte wo sie ist und hast irgendwann 20 Tabellen in deinem Frame
ehrlich gesagt ist mir das schon alles bei meinem letzten thread 4h vorher aufgefallen.
http://www.java-forum.org/java-basics-anfaenger-themen/143440-jtable-aktualisieren.html

ich habs aber jetzt ehrlich gesagt erst einmal nach hinten verschoben.
Zunächst setzte ich den Button einfach auf setEnabled( false ); , damit wenigstens nicht zwei Tabellen übereinander geschrieben werden.

Aber jetzt mal im ernst. Dir muss doch klar sein, das wenn ich im Anfängerforum poste auch Anfängerfragen habe, oder!
Und natürlich hätte ich auch gerne erst 2 Jahre Vorkurs, bevor ich mich an meine Tabelle mache,
die ich bzw. in 1 Monat fertig stellen muss. Ob ich mich, nachdem ich fertig bin, noch weiter mit Java beschäftige, das wird sich zeigen, Spaß gemacht hat es bisher ja.

Dein Post hat mir fast null weitergeholfen, und ich schiebe deine Art zu schreiben auf die Uhrzeit.
-.-'
 

TKausL

Top Contributor
Hallo nochmal,

ja du postest im "Anfänger" Forum, aber GUI-Programmieren ist nichts für Anfänger, nichts gegen dich.

Ich sehe an deinem Code einfach, dass du viele defizite in den Grundlagen hast.
Und leider ist es mir immernoch nicht möglich dein Problem welches du schilderst zu lösen, denn du schreibst nur DASS dir ein Fehler angezeigt wird, aber ich weiß immernoch nicht WELCHER Fehler dir angezeigt wird.
Ich versuche dir mal zu helfen, habe aber noch 2 Fragen:

Wird dir der Fehler in Eclipse angezeigt (Unterstrichen)? Wenn ja, was sagt eclipse wenn du mit der Maus drüber fährst?
Wird dir eine Exception geschmissen beim ausführen? Wenn ja, welche?
 
Ich will dich ja genauso wenig angreifen.
Und ich weiß ja auch, das ich noch diverse Schwächen in den Grundlagen habe.
Ich muss nun einmal diese Tabelle erstellen, für ein komplett anderes Projekt, was nichts mit Java oder Informatik zu tun hat.
Der Fehler wird auch einfach daran liegen, das ich in public versuch3() (zeile ab 37)
final DefaultTableModel model = new DefaultTableModel( title, 0 ); schreibe
und anschließend erst im ActionListener (ab Zeile 64)
das addRow aufrufe.
Ich gehe mal davon aus, das der ActionListener DefaultTableModel gar nicht kennt.
Wenn ich addRow direkt oben aufrufe, dann wird addRow auch nicht als Fehler angezeigt.
(Fehler ist : model cannot be resolved)

Vermutlich muss ich mal meinen ganzen Programmaufbau überdenken.
In meinem Buch wird auch meistens erst alles in den Konstruktor reingeschrieben und erst später in der main aufgerufen.
In den meisten Seiten im web, wird immer direkt alles in die main geschrieben, was mich auch noch immer verwirrt.

Gestern hattes du noch das geschrieben.
Du addest dem Vector nicht den inhalt des Arrays sondern jedesmal den gleichen String
Du resettest den Vector nicht nach jedem durchlauf
Hierzu
Java:
String []dataZeile  = zeile.split(";");
//Keine Ahnung ob richtig
for(i =0; i <=3; i++)
{vector.add("dataZeile[i]");}

Ich verstehe Vector als eine Art Liste, der ich Elemente hinzufügen kann.
Kann ich dem Vector so nichts hinzufügen. (Ein Beispiel würde helfen)
Da ich alles in eine while Schleife gepackt hatte, habe ich mir auch gedacht, das ich den Vector nicht reseten muss.
Er soll ja einfach überschrieben werden.
Ich hoffe das sind nicht zu viele Fragen. ;)
 

Volvagia

Top Contributor
Das ist eine andere Klasse. Eine nested class (Soviel wie eine Klasse in ner Klasse) kann als nicht-statische Klasse nur auf die Instanz- und Klassenvariablen der Oberklasse zugreifen. Du hast aber kein Feld (Instanzvariable) mit dem Namen model.
Mit besseren Tabulatoren wäre es dir wahrscheinlich selbst aufgefallen. :(
 

TKausL

Top Contributor
Natürlich kannst du so
Java:
vector.add("dataZeile[i]");
dem Vector Daten adden.
Allerdings addest du jedesmal den String "dataZeile". Ich denke eher, dass du das hier suchst:
Java:
vector.add(dataZeile[i]);

Außerdem solltest du nachdem du die Zeile geadded hast
Java:
vector.clear();
nutzen. Damit leerst du den Vector wieder.

Ansonsten addest du der Tabelle im ersten durchlauf:
Data1, Data2, Data3, Data4
im Zweiten
Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8
im Dritten
Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11, Data12

und so weiter...

[EDIT]Natürlich kannst du auf das Model nicht zugreifen, da es eine Locale Variable des Konstruktors ist.[/EDIT]
 
Zuletzt bearbeitet:
Java:
vector.add("dataZeile[i]");

ok, das war natürlich dumm.:oops:
Das hätte selbst mir auffallen müssen.
Ich schiebe es mal auf die Uhrzeit von gestern.
Aber die Backpfeife hatte ich damit wohl verdient.

Java:
vector.clear();
War mir nicht klar, da ich dachte, das mit
Java:
Vector vector = new Vector( 3 );
Der Platz im Vektor auf 4 "Stellen" begrenzt ist und jedes mal von vorne überschrieben wird.
Danke dafür.

Natürlich kannst du auf das Model nicht zugreifen, da es eine Locale Variable des Konstruktors ist.
Genau das habe ich ja selber vermutet.
Aber wie kann ich dem ActionListener jetzt die Variable übergeben?

Ich kann ja jetzt wieder
Java:
final DefaultTableModel model = new DefaultTableModel( title, 0 ); 
JTable tabelle = new JTable(model);
erst im ActionListener aufrufen.
Aber das ist doch dann wieder genauso unsauber, wie bei deinem ersten Punkt,
wo du mir gesagt hast, das ich die Tabelle nicht jedesmal im ActionListener aufrufen soll,
weil sich sont mehrer Tabellen überlappen.

Am besten wäre ja, die Tabelle erst aufzurufen und später nur zu beschreiben und leere Zeilen hinzuzufügen.
 

Volvagia

Top Contributor
Entweder du übergibst es dem Constructor des Listeners (was mir persönlich nicht gefällt) oder schreibst das Model in ein field.


[TIPP]Verwende doch ein Array statt einen Vector.[/TIPP]
[TIPP]Deine for wird niemals abgearbeitet[/TIPP]
[TIPP]Verwende doch Methoden zur Auslagerung von Programmteilen. Das sind die echten Kommentare und sie halten den Codefluss flüssiger.[/TIPP]
[TIPP]Ein leeres catch ist (abgesehen von ein paar wenigen echten Ausnahmen) die wohl schlechteste Praktik, die es gibt.[/TIPP]
 
Zuletzt bearbeitet:
Verwende doch ein Array statt einen Vector.
Mit einem Array habe ich das ganze schon gestern fertig gemacht.
Ich wollte aber jetzt das DefaultTableModel benutzen.
So wie ich das verstanden habe, wird da nun einmal mit Vectoren gearbeitet.
Da ich nicht nur vorhabe die Daten in die Tabelle zu "laden" sondern auch noch neue Zeilen hinzufügen möchte. Das Array ist da glaube ich zu statisch.

Deine for wird niemals abgearbeitet
ich glaube ich weiß was du meinst, das habe ich schon geändert. s.o.
for(i =0; i <=3; i++)

Ein leeres catch ist (abgesehen von ein paar wenigen echten Ausnahmen) die wohl schlechteste Praktik, die es gibt.
Tut mir leid, das verstehe ich im Moment noch nicht. ;)

Ich versuche mir jetzt erstmal etwas hierzu duchzulesen.
Entweder du übergibst es dem Constructor des Listeners (was mir persönlich nicht gefällt) oder schreibst das Model in ein field.
 

TKausL

Top Contributor
Wie kommst du darauf, dass
Java:
new Vector( 3 );
ein Vector mit der Größe 4 erstellt? Wenn dann solltest du auch schon 4 und nicht 3 angeben,
wobei ich beim Vector aber nicht weiß ob die Angabe nur die Initial-Größe oder auch die Maximalgröße ist.
 

Volvagia

Top Contributor
Schau dir mal das an.

Namen (Die Schreibweiße, englisch benutze ich nur da deutsch mir zusammen mit den englischen Sprachkonstruktoren in den Augen sticht), Felder, try/catch, Auslagerung in eine Methode, Tabulatoren.

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Versuch3 extends JFrame {
	private static final long serialVersionUID = 1L;
	
    private static final String[] TABLE_COLUMN_NAMES = new String[] {
        "Name", "Ort", "Nummer", "Barcode"
    };
    
    private JTable table;
    private DefaultTableModel model;
 
    public Versuch3() {
    	model = new DefaultTableModel(TABLE_COLUMN_NAMES, 0);
        table = new JTable(model);
        
        Container contentPane = getContentPane();
        
        contentPane.add(new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));
        
        JPanel southPanel = new JPanel(new GridLayout(1,4));
        
        JButton showAllObjectsButton = new JButton(new ShowAllObjectsAction("Alle Objekte anzeigen"));
        southPanel.add(showAllObjectsButton);
        
        JButton showFoundObjekteButton = new JButton("Gefundende Objekte anzeigen");
        southPanel.add(showFoundObjekteButton);
        
        JButton newLineButton = new JButton("neue Zeile");
        southPanel.add(newLineButton);

        JButton saveButton = new JButton("Speichern");
        southPanel.add(saveButton);
            
        contentPane.add(southPanel, BorderLayout.SOUTH); 
    }
    private class ShowAllObjectsAction extends AbstractAction {
    	public ShowAllObjectsAction() {
    		this(null);
    	}
    	public ShowAllObjectsAction(String text) {
    		this(text, null);
    	}
    	public ShowAllObjectsAction(String text, Icon icon) {
    		super(text, icon);
    	}
    	public void actionPerformed(ActionEvent e) {
    		File file = new File("texttabelle.txt");
    		if(!file.exists()) {
    			JOptionPane.showMessageDialog(null, "Sorry, the request File dosn't exist.\nCannot continue.", null, JOptionPane.ERROR_MESSAGE);
    			return;
    		}
    		
    		BufferedReader br = null;
    		try{
    			FileReader fr = new FileReader(file);
    			br = new BufferedReader(fr);
    			
    			String[][] fileContent = readANSIFileToArray(br);
    			
    			for(String[] line:fileContent) {
    				model.addRow(line);
    			}
    			table.revalidate();
    		}
    		catch(IOException ex) {
    			JOptionPane.showMessageDialog(null, "Sorry, while reading File an Error is occurred:\n" + ex.getMessage(), null,
    					JOptionPane.ERROR_MESSAGE);
    		} finally {
    			try {
					if(br != null) {
						br.close();	
					}
				} catch (IOException e1) {
					e1.printStackTrace();
				}
    		}
    	}
    }
    private String[][] readANSIFileToArray(Reader reader) throws IOException {
    	if(!(reader instanceof BufferedReader)) {
    		return(readANSIFileToArray(new BufferedReader(reader)));
    	}
    	
    	BufferedReader br = (BufferedReader) reader;
    	
    	String[][] values = new String[6][8]; //Hier spaare ich mir mal die Dynamik.
    	
    	int lineCounter = 0;
    	for(String s = null; (s = br.readLine()) != null; lineCounter++) {
    		String[] lineContent = s.split(";");
    		
    		for(int y = 0, size = lineContent.length; y < size; y++) {
    			values[lineCounter][y] = lineContent[y]; //Hm, values[lineCounter] = lineContent[y]; funktioniert leider nicht. Nie getestet, aber denke so müsste es auch klappen.
    		}
    	}
    	return(values);
    }
    public static void main (String []args) {
        EventQueue.invokeLater(new Runnable() {
			public void run() {
				JFrame fenster = new Versuch3();
		        
		        fenster.setTitle("RFID Finder Tabellenansicht");
		        fenster.setSize(900,700);
		        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		        
		        fenster.setVisible(true);
				
			}
		}); 
    } 
}
 

TKausL

Top Contributor
Java:
            String[] lineContent = s.split(";");
            
            for(int y = 0, size = lineContent.length; y < size; y++) {
                values[lineCounter][y] = lineContent[y]; //Hm, values[lineCounter] = lineContent[y]; funktioniert leider nicht. Nie getestet, aber denke so müsste es auch klappen.
            }

Sollte so auch funktionieren:

Java:
            String[] lineContent = s.split(";");
                values[lineCounter] = lineContent;
 

Volvagia

Top Contributor
Ups danke, du hast recht. Da war ich wohl mit den Gedanken wo anderst. x_x"
Wollte wie im Kommentar den einzelnen String in das Array-Feld, dass ein Array erwartet schreiben.
 
nur damit ihr beide mich nicht für unhöflich haltet.
Ich habe gesehen was ihr gepostet habt.
Vielen Dank dafür.
Ich muss allerdings jetzt kurz weg. (Familiäre Verpflichtung. Geburtstag Tante, nicht das ich da hin wollen würde.:D)

Ich lese mir euren Code heute Abend, spätestens morgen durch und werde dazu schreiben ob ich es verstanden habe. Habe mir grade eben noch ein paar Grundlagen angeschaut.
Danke nochmal für eure bisherige Hilfe.
 
Ich wollte mich nur nochmal melden und bedanken.
Hat jetzt zwar doch ein paar Tage mehr gedauert, da ich unter der Woche keine Zeit fürs Programmieren gefunden hatte.

Ich musste mir deinen/euren code genau durchlesen, da ich beim ersten überfliegen direkt gemerkt habe, das ich nicht alle Zeilen verstehe.
Habe mich aber mit ein paar Büchern und dem Internet entlang gehangelt.
Habe auch schon ein bisschen weiter gemacht.
Z.B das array etwas dynamischer gestaltet oder das Zeilen hinzufügen implementiert.

Als nächstes Versuche ich das Speichern zu realisieren.
Habe mir dafür schon das Wochenende reserviert.

Nochmal einen großen Dank an euch beide.
Ich mache dann einen neuen thread auf, wenn ich wieder so gar nicht weiter komme.
Aber ich versuche jetzt erstmal wieder selber was zu leisten, bevor ich um Hilfe bettel. :D
 

Ähnliche Java Themen

Neue Themen


Oben