JTable wird nicht erzeugt, wieso?

Tino124

Mitglied
Hallo allerseits, ich habe folgendes Problem. Und zwar möchte ich, dass über einen Buttonklick in meiner GUI eine befüllte Tabelle erzeugt wird, die ihre Daten von einer XML Datei bezieht. Das ganze ist auch professorisch ohne den Button gelaufen, aber nun wird mir keine Exception übergeben, das ganze Funktioniert aber Trotzdem nicht. Hier einmal mein Code :

Java:
import java.awt.Button;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;


public class Test extends AbstractTableModel{
	
	//erstelle Frame
	
	/*
	 * 
	 */
	private static final long serialVersionUID = 1L;
//erstellt statische Variablen für die Fenster
  static TextArea ta;
  static TextField tf;
  static Vector<String> data;
  static Vector<String> columns;
  private static JTextField eingabe;
  private static JButton bestätigen;

   public static void main(String[] args) {
	   
			Test t = new Test();
	        JTable table = new JTable();
	        table.setModel(t);
	        table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer()
	        {
	            /**
				 * 
				 */
				private static final long serialVersionUID = 1L;
				String[] cols = {"Linie","Ziel","Platz","HF","Abfahrt in (min)"};
	            public Component getTableCellRendererComponent(JTable arg0,Object arg1, boolean arg2, boolean  arg3, int arg4,int col) 
	            {
	                this.setText(cols[col]);                                        
	                return this;
	            }
	        });
	        
	        JScrollPane scrollpane = new JScrollPane(table);
	        JPanel panel = new JPanel();
	        panel.add(scrollpane);
	        JFrame frame = new JFrame();
	        frame.setTitle( "Mir fällt kein sinnvoller Name ein PROGRAMM" );
	        frame.setSize(600,500);
	 	    frame.setLocation(100,100);
	        JTextField TF = new JTextField("");
	        JButton Button = new JButton("Klick mich!!");
	        frame.add(panel, "North");
	        frame.add(TF, "Center");
	        frame.add(Button, "South");
   
   			//Methode für den Button
	        
   Button.addMouseListener(
   new MouseAdapter(){
   public void mouseClicked(MouseEvent e){
	  
   try {
	   Test t = new Test();
       JTable table = new JTable();
       table.setModel(t);
	   Test2.lesen(t);
	   

        System.out.println("test");
} catch (Exception e1) {
	e1.printStackTrace();
}
   }
   
   
   }
   );
   
   //macht das fenster sichtbar
   frame.setVisible(true);
   }
   

   //Getter
	public TextArea ta(){
	return  ta;
	}



	@Override
	public Object getValueAt(int arg0, int arg1) {
		return null;
	}
	public static JButton getBestätigen() {
		return bestätigen;
	}

	public static void setBestätigen(JButton bestätigen) {
		Test.bestätigen = bestätigen;
	}

	public static JTextField getEingabe() {
		return eingabe;
	}

	public static void setEingabe(JTextField eingabe) {
		Test.eingabe = eingabe;
	}


	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 0;
	}


	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return 0;
	}
	


}

Und die 2 Klasse :

Java:
import java.io.*;
import java.net.URL;
import java.util.Vector;
 
import javax.swing.table.AbstractTableModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class Test2 {
 
    /**
     * @param t
     */


	public static void lesen(Test t) throws Exception {
	
    	
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(new URL("xy.php")
                            .openStream());
            doc.getDocumentElement().normalize();
               
                
                
            NodeList n1 = doc.getElementsByTagName("Linie");
            NodeList n2 = doc.getElementsByTagName("Ziel");
            NodeList n3 = doc.getElementsByTagName("Platz");
            NodeList n4 = doc.getElementsByTagName("HF");
            NodeList n5 = doc.getElementsByTagName("Zeit");
 

            
            NodeList DFIpublic = doc.getElementsByTagName("Abfahrt");
            Test.data = new Vector<String>();
            Test.columns = new Vector<String>();
            for (int i = 0; i < DFIpublic.getLength(); i++)            
            {                 
             Test.data.addElement(n1.item(i).getFirstChild().getNodeValue());
             Test.data.addElement(n2.item(i).getFirstChild().getNodeValue());
             Test.data.addElement(n3.item(i).getFirstChild().getNodeValue());
             Test.data.addElement(n4.item(i).getFirstChild().getNodeValue());
             Test.data.addElement(n5.item(i).getFirstChild().getNodeValue());            
            
            }
            Test.columns.add("");
            Test.columns.add("");
            Test.columns.add("");
            Test.columns.add("");
            Test.columns.add("");

 
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
    public int getRowCount() {
        return Test.data.size() / getColumnCount();
    }
 
    public int getColumnCount() {
        return Test.columns.size();
    }
 
    public Object getValueAt(int rowIndex, int columnIndex) {
        return (String) Test.data.elementAt((rowIndex * getColumnCount())
                + columnIndex);
    }
}


Habt gnade ich bin Java Neuling :rtfm:
 
Zuletzt bearbeitet von einem Moderator:
Hmm, keine Ahnung, was genau du da machst, aber deine Klasse Test ist das TableModel und dort hast du auch deine main-Methode und dein JTable drin. Ich würde das mal anders (besser) strukutrieren und für GUI und Model separate Klassen anlegen. Vielleicht wird es dann übersichtlicher...

EDIT: Also einfach erstmal das TableModel auslagern z.B. in eine Klasse MyTableModel extends AbstractTableModel, und das dann in der Klasse Test der JTable übergeben.
 
Zuletzt bearbeitet von einem Moderator:
in einem Listener nur eine JTable zu erzeugen kann nur begrenzte Auswirkungen haben,
es fehlt offensichtlich z.B. das Einfügen in die GUI?

zur Laufzeit die GUI zu verändern ist generell unsauber, bringt das Layout durcheinander, ist das nötig?
kann es auch bei einer von Anfang an vorhandenen JTable bleiben, deren Model ausgetauscht wird?

auch noch besser sind versteckte GUI-Seiten, mit CardLayout eingeblendet
 
Nur das Model austauschen würde auch gehen, nur kenne ich mich mit dem JTable gar nicht aus. Das war ein Vorschlag von meinem "Lehrer" und ich hab das ganze nach einer Musterlösung aus dem Internet aufgebaut. Wie würde das denn aussehen wenn ich ein "Model" austausche?
 
die erste Table in einem Instanzattribut speichern, z.B. 'table',
dann bist du mit Zeile 80
> table.setModel(t);
schon gut dabei, Zeile 79 weg

von Test aus ein neues Test-Objekt zu erzeugen ist aber generell komisch,
da bist du mit eigener TableModel-Klasse, darin die Datenfelder usw., wohl besser dran,
bei begrenzten Verständis wäre das jetzt aber viel zu erklären..

das lesen() besser aber VOR Zeile 80
 
Zum Grundverständnis der JTable: Normalerweise hast du 1 JTable und 1 TableModel. Das TableModel wird der JTable gesetzt. Im TableModel hast du die Daten, welche du in der JTable anzeigen möchtest. Wenn sich nun Daten ändern oder aktualisieren sollen, änderst du die Daten im TableModel und das Model aktualisiert dann die Daten in der JTable.

Aber versuch doch mal, das TableModel in eine eigene Klasse auszulagern und in der Klasse Test der JTable zu übergeben. Du wirst dann sehen, wie einfach und übersichtlicher das plötzlich wird.
 
Ja, die JTable gehört zur GUI (oder auch View). Und normalerweise trennst du auch das Model (TableModel, Daten) von der View (GUI, Ansicht).
 
Ach mist, jetzt hab ichs verstanden. Sorry, das JTable macht mich ganz wirr im Kopf!
Warum wird verlangt das ich das JTable auf Final setzte, wenn ich im Listener kein Neues Jtable erstelle sondern nur das Model ändere? Ein Finaler Wert kann doch nicht mehr geändert werden oder ist mein Standpunkt in dem Fall auch falsch?
 
die Variable ist final, kann nicht auf eine andere JTable oder selbst null geändert werden, die JTable darf noch verändert werden,
für Listener ist das eben so damit Java sich sicher ist was dort später zu verwenden ist, ein Thema für sich


mit final gehts, ja, ich dachte der Listener stände ganz woanders, dann wäre Instanzattribut angebracht, was wiederum nicht final ginge
(also es wird in dieser Frage weitergehen, ob alles funktioniert muss sich noch Zeigen, viele Haken möglich)
 
Ich ab jetzt mal ein paar Stündchen dran rumgetüfftelt und bin mal wieder zu keinem Ergebnis gekommen, ich glaube mein Lösungsansatz ist komplett falsch. Ich muss das ganze nochmal komplett umstrukturieren. Oder es funktioniert doch irgendwie nur ich bin zu blöd das auf die Reihe zu bekommen. Ich werde das ganze jetzt nochmal neu schreiben und statt den Vectoren mal ein 2 dim. Array verwenden und das JTable von dem eigentlichen UI abkoppeln, in der Hoffnung so zu einem Ergebnis zu kommen.
 
Das habe ich heute auch mehrmals probiert, aber ich bin auf kein Ergebnis gekommen. Entweder du hast Recht und meine Kenntnisse reichen nicht soweit oder der Code den ich da oben geschrieben hab ist völlig schwachsinnig, eins von beiden wird es sein. Aber danke für den Vorschlag.
 
Du hättest einfach nur eine Klasse schreiben müssen, abgeleitet von AbstractTableModel. Zum Beispiel
Code:
MyTableModel extends AbstractTableModel
. Eclipse (falls du damit arbeitest) bietet dir dann sogar an, automatisch die benötigten Methoden zu erstellen. Von diesem Model hättest du dann in deiner Hauptklasse ein Objekt erstellt und der JTable im Konstruktor mit übergeben.
Java:
MyTableModel tableModel = new MyTableModel();
JTable myTable = new JTable(tableModel);
Alles weitere mit den Daten hättest du dann im Model gemacht. Wäre auf jeden Fall schon mal übersichtlicher und damit auch weniger fehleranfällig. Ich oder andere hätten dir da bestimmt weiter geholfen, aber wenn du es noch nicht mal versuchst...
 

Neue Themen


Zurück
Oben