JTable dynamisch befüllen

Myar

Mitglied
Hallöchen!

Ersteinmal, ja ich habe nach ähnlichen Threads gesucht, doch was ich fand, hat mir nicht wirklich weiter geholfen, deshlab frage ich expliziet für mein Problem nach ;)

Nun, ich habe ein Programm geschrieben, dass eine auswählbare Datei mit einer festen Vorlage vergleicht.
Das Ergebnis des Vergleichs wird bisher in einer JTextArea ausgegeben.
Nun muss anstatt der JTextArea eine Tabelle her, die die Parameter mit Werten aus den beiden Dateien nebeneinander in einer Tabelle auflistet und in einer dritten Spalte sagt "TRUE" oder "Parmeter nicht in Vorlage" oder "Wert falsch".

So, bis hierhin nicht so schwer, das Programm lief, wenn ich nun Start drücke, läuft das programm durch, gibt mir die richtige Ausgabe noch immer auf der TextArea und ein Extrafenster öffnet sich, in dem eine Tabelle erscheint.

Jetzt komm ich nicht weiter.
Beim lesen das Java "Handbuchs" (dieser Schinken soll nen Handbuch sein...) war halt dargestellt, dass man die Reiehen der Tabelel mit einem Zweidimensionalen Array füllt.
So, die Werte die da rein müssen, befinden sich in seperaten Klassen in vier ArrayLists
(Eine für die Parameter der zu prüfenden Datei, eine für deren Werte und das Gleiche für die Vorlage).

Das heißt also, dass die Reihen mit dem Index "i" aus der ArrayList befüllt werden müssten... zudem noch je nach Situation die dritte Spalte, mit den jeweiligen Ausgaben.

Zum verdeutlichen mal der Code der Tabelle:

Code:
package Programmieraufgabe;
import javax.swing.*;
public class Table
implements TableData {

	public void table() {
// Hier wird das zweite Fenster für die Tabelle angelegt
		JFrame fenster2 = new JFrame();
		fenster2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster2.setLocation(300, 150);
		fenster2.setSize(650, 730);
		fenster2.setVisible(true);

   // nen Label für die Überschrift der Tabelle
		JLabel lbltitel = new JLabel();
		lbltitel.setText("Ergebnis des Vergleichs:");
		lbltitel.setBounds(7, 7, 200, 30);
		fenster2.add(lbltitel);
                                
  // Die Tabelle und das Scrollfenster dazu
		JTable table = new JTable(DATA, COLHEADS);

		JScrollPane scrollPane = new JScrollPane(table);
		scrollPane.setBounds(7, 40, 625, 657);
		fenster2.add(scrollPane);
	}
}

So, bis hierhin ja noch einfach.... dann das Befüllen der Tabelle:

Code:
package Programmieraufgabe;

public interface TableData {

	public static final String[][] DATA = {
		{ Einlesen.para.get(0) + " = " + Einlesen.werte.get(0),
		Vorgabe.para2.get(0) + " = " + Vorgabe.werte2.get(0),
			"TRUE" },
		{ Einlesen.para.get(1) + " = " + Einlesen.werte.get(1),
		Vorgabe.para2.get(1) + " = " + Vorgabe.werte2.get(1),
			"TRUE"} 
					};
			

	public static final String[] COLHEADS = { "Eingelesene Datei", "Vorgabe",
			"Meldung" };
}

So, zur Veranschaulichung habe ich mal die Namen der ArrayLists schon eingetragen.
Einlesen ist dabei die Klasse, welche die zu prüfende Datei einliest (mit ner Schleife, logisch). Vorgabe ist die Klasse, welche dann die zutreffende Vorgabedatei nach Auswahl genau so einliest wie die erste.
para, para2, werte, werte2 sind die Namen der ArrayLists.
In para werden Parameter gespeichert (bis zu einem "=" dann kommt nen Trim)
In werte dann der Wert hinter dem "=".
Das Gleiche für die andere Datei.

So, nun ist es so, dass die Tabelle mit zwar wunderbar den Wert bei Index 0 der ArrayList para anzeigt, und das Gleiche bei Index 1, aber die Dateien können unterschiedlich groß sein, so dass ich nciht hartcodiert alle Zeilen extra definieren könnte.
Nur ne f - Schleife lässt er auch nicht zu.

Hier brauch ich jetzt Hilfe... Wie bekomme ich es hin, dass er pro Zeile der Tabelle, mir den Wert der ArrayList um einen Index erhöht ausgibt?
Und dazu die ja durch eine if-Bedingung bestimmte Ausgabe ob es TRUE oder FALSE ist (Also die Parameter bzw. die Werte passen)?

Ich hoffe, dass mein Problem verständlich ist...
Wie gesagt, wie ich die Tabelle aufbaue, hab ich so ausm Java Handbuch übernommen, von daher kenne ich mehr Befehle für so ne Tabelle nicht... und on OO bin ich noch net sooo bewandert, bin gerne lernbereit aber müsst es erklärt bekommen irgendwie :)

Schonmal vielen Dank dafür, dies überhaupt gelesen zu haben :D

Gruß
Myar
 
Moin!
So ganz hab ich nicht verstanden, was du denn machen willst..
Aber auf jeden Fall kann man sich das Leben auch ein wenig Leichter machen, in dem man ein eigenes TableModel erstellt...
Mal ein einfaches Beispiel:
Code:
/*
 * CustomTableModel.java
 *
 * Created on 14. Dezember 2007, 11:35
 *
 */



import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author jweckbach
 */
public class CustomTableModel extends DefaultTableModel{
    private ArrayList one, two = null;
    /** Creates a new instance of CustomTableModel */
    public CustomTableModel(ArrayList one, ArrayList two) {
        this.one = one;
        this.two = two;
                
    }
    public Object getValueAt(int row, int column){
        if(column ==0)
            return one.get(row);
        if(column ==1)
            return two.get(row);
        else
            return one.get(row).equals(two.get(row));
    }
    public int getRowCount(){
        if(one == null)
            return 0;
        return one.size();
    }
    public int getColumnCount(){
        return 3;
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ArrayList one = new ArrayList();
        one.add(1);
        one.add("ab");
        one.add("d");
        ArrayList two = new ArrayList();
        two.add(1);
        two.add("abc");
        two.add("d");
        JTable table =new JTable(new CustomTableModel(one,two));
        JFrame j = new JFrame();
        j.setSize(400,400);
        j.getContentPane().add(table);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        j.setVisible(true);
        
    }
    
}

Das solltest du recht einfach an deine Bedürfnisse anpassen können..
Und vielleicht solltest du noch ein wenig mehr über Tables und TableModel lesen.. Dazu steht sicherlich auch etwas im Java Handbuch..

*grüssle*
MeinerEiner
 
Vielen lieben Dank!

Hat damit wunderbar geklappt! :) (nach langem hin und her rätseln)

Zwe Fragen hät ich nun noch *räusper*

Also zum einen hät ich es gerne, dass wenn ich das Tabellenfenster schließe, nicht gleich das ganze Programm sich schließt (da ist ja noch ein Fenster, welches das Hauptprogramm darstellt).
Also, ich starte das Hauptprogramm, das hat im Fenster oben rechts das kleine "x" zum schließen.
Wenn ich starte, öffnet sich das Fenster mit der Tabelle. Auch mit dem "x".
Nun, klicke ich jetzt bei der Tabelle auf das "x", schließt das ganze Programm, aber das hauptprogramm (erstes Fenster) soll bestehen bleiben.

Zum anderen, mit deinem Code heißen die Spalten nun A, B und C.
wie kann ich denen einen eigenen Namen geben?

Ersters wäre nicht so dringlich, aber das mit den Namen wäre toll, wenn du (oder jemand anderes) noch wusste.

Aber nochmals danke bis hierher!

Gruß
Myar
 
Zum anderen, mit deinem Code heißen die Spalten nun A, B und C.
wie kann ich denen einen eigenen Namen geben?
Du solltest auch mal ein bisschen in der APi stöbern.. Da steht eigentlich alles drin was man braucht...
Zum Beispiel bietet das TableModel auch die Methode
Code:
String:getColumnName(int index)
an. Die musst du dann entsprechend überschreiben...

Zu deiner anderen Frage..
In meinem Code nutze ich die Methode setDefaultCloseOperation(); Damit kannst du angeben, was passieren soll, wenn auf das Kreuz geklickt wird.. Musst dann halt den entsprechenden Parameter übergeben http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/WindowConstants.html

*grüssle*
MeinerEiner
 
Zurück