# Daten aus Datei lesen und in JTable anzeigen



## BigBoss (8. Aug 2004)

ich möchte gerne aus einer datei lesen welche eine txt ist und aus vielen daten besteht welche mit | getrennt werden

diese daten sollen da in eine jtable eingefügt werden habe da schon mal ein versuch gestartet der aber nicht 100% funktioniert :cry: 

```
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class SimpleTable
{
  public static void main( String args[] )throws IOException
  {
  	/*String zeile = "a|b|c"; 
  	String [] felder = zeile.split("\\|"); 

  	for ( int i = 0;i < felder.length;i++) 
  	System.out.println ( felder[i] );
  }
}*/
  	BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt")); 
  	int gelesen;
  	String eingabezeile;
  	eingabezeile=eingabe.readLine();
  	StringTokenizer  token= new StringTokenizer (eingabezeile);
  	
  	String[] felder =eingabezeile.split("\\|");
  	//String[] token=eingabe.readLine();
  	StringBuffer text =new StringBuffer(10);
  

  	//StringTokenizer tokens =new StringTokenizer(token.split("|"));
  	boolean ende =false;
  	for ( int i = 0;i < felder.length;i++) 
  	  	System.out.println ( felder[i] );

  	String rowData[][] = {felder
  	      
  	    };
  	String  columnNames[] = {
  	      "Land", "Durchschnittliche Sehdauer pro Tag in Minuten","a","b","c","d","e",
		  "a","b","c","d","d","g"
  	    };
  	    JTable table = new JTable( rowData, columnNames );
  	    JFrame frame = new JFrame();
  	    frame.getContentPane().add( new JScrollPane(table) );
  	    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  	    frame.pack();
  	    frame.setVisible( true );
  }
}
```

das prob ist das immer nur eine zeile gelesen wird was natürlich auf das eingabe.readLine zurück zu führen ist aber wenn ich das nicht so mache geht das .split nicht


PS ich schreibe das deswegen in das anfänger topic rein da ich mir das selbst durch googeln herbei gesucht habe und angepasst habe
ich habe bislang sowas noch nie gemacht :meld:


----------



## Beni (8. Aug 2004)

Speichere doch die Eingaben einfach kurz.

Das würde dann etwa so aussehen (habs nicht getestet):

```
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class SimpleTable
{
  public static void main( String args[] )throws IOException
  {
     /*String zeile = "a|b|c";
     String [] felder = zeile.split("\\|");

     for ( int i = 0;i < felder.length;i++)
     System.out.println ( felder[i] );
  }
}*/
     BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt"));
     int gelesen;
     String eingabezeile;

     eingabezeile=eingabe.readLine();

     Vector input = new Vector();  // #### in diesem Vector speichern

     while( eingabezeile != null ){
       StringTokenizer  token= new StringTokenizer (eingabezeile);
     
       String[] felder =eingabezeile.split("\\|");
       //String[] token=eingabe.readLine();
       StringBuffer text =new StringBuffer(10);
        
       input.add( felder );

       //StringTokenizer tokens =new StringTokenizer(token.split("|"));
       eingabezeile=eingabe.readLine();
     }

     boolean ende =false;
     for ( int i = 0;i < felder.length;i++)
          System.out.println ( felder[i] );

     Object rowData[][] =  (Object[][])input.toArray();

     String  columnNames[] = {
           "Land", "Durchschnittliche Sehdauer pro Tag in Minuten","a","b","c","d","e",
        "a","b","c","d","d","g"
         };
         JTable table = new JTable( rowData, columnNames );
         JFrame frame = new JFrame();
         frame.getContentPane().add( new JScrollPane(table) );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         frame.pack();
         frame.setVisible( true );
  }
}
```


----------



## BigBoss (8. Aug 2004)

habe das einfach mal eingefügt in mein code und da kommen fehler bei
	
	
	
	





```
for ( int i = 0;i < felder.length;i++) 
          System.out.println ( felder[i] );
```
  felder can not be resolved
das liegt daran das felder in der while schleife ein wert zugewiesen wird


----------



## Beni (8. Aug 2004)

Dann musst du das halt auch noch in die Schlaufe nehmen. Wie gesagt, habs nicht getestet, ist nur ein allgemeiner Tipp, wie es funktionieren könnte...

 :wink:  Gruss Beni


----------



## BigChamp (8. Aug 2004)

habe mal die while schleife auskommentiert und das mit jtable auch nun gibt er wieder nur die erste zeile aus


----------



## Beni (8. Aug 2004)

Dieser Code:

```
/*
 * Created on 23.06.2004
 */
package forum;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

import javax.swing.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class SimpleTable
{
  public static void main( String args[] )throws IOException
  {
     /*String zeile = "a|b|c";
     String [] felder = zeile.split("\\|");

     for ( int i = 0;i < felder.length;i++)
     System.out.println ( felder[i] );
  }
}*/
     BufferedReader eingabe = new BufferedReader(new FileReader("test.txt"));
     int gelesen;
     String eingabezeile;

     eingabezeile=eingabe.readLine();

     Vector input = new Vector();  // #### in diesem Vector speichern

     while( eingabezeile != null ){
       StringTokenizer  token= new StringTokenizer (eingabezeile);
     
       String[] felder =eingabezeile.split("\\|");
       //String[] token=eingabe.readLine();
       StringBuffer text =new StringBuffer(10);
       
       input.add( felder );

       //StringTokenizer tokens =new StringTokenizer(token.split("|"));
       eingabezeile=eingabe.readLine();
       
       for ( int i = 0;i < felder.length;i++)
        System.out.println ( felder[i] );
     }

     boolean ende =false;

     Object rowData[][] =  (Object[][])input.toArray( new Object[ input.size() ][] );

     String  columnNames[] = {
           "Land", "Durchschnittliche Sehdauer pro Tag in Minuten", "Blupp", "Bla"
         };
         JTable table = new JTable( rowData, columnNames );
         JFrame frame = new JFrame();
         frame.getContentPane().add( new JScrollPane(table) );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         frame.pack();
         frame.setVisible( true );
  }
}
```

+ diese Datei:


> a1|b1|c1|d1
> a2|b2|c2|d2
> a3|b3|c3|d3
> a4|b4|c4|d4



=


----------



## Guest (9. Aug 2004)

danke erstmal für deine hilfe aber ich habe schon die nächste frage :lol: 

eine horizontale bildlaufleiste wie geht das?

ich brauche da noch button oder menüleiste drin wo man laden und speichern kann!


----------



## thE_29 (9. Aug 2004)

das ganze in ein JScrollPane hängen


----------



## Guest (9. Aug 2004)

frame.getContentPane().add( new JScrollPane(table) );

vertikal leiste  aber wie horizontal :bahnhof: 

menü
	
	
	
	





```
JMenuBar leiste=new JMenuBar();
     JMenu menu1 =new JMenu("Datei");
     JMenuItem item1 =new JMenuItem("Neu");
     menu1.add(item1);
     leiste.add(menu1);
     setJMenuBar(leiste);
```

geht nicht im simple table ???:L


----------



## pogo (9. Aug 2004)

Bei mir in Netbeans klappt es net warum.
Er zeigt an er hat die Datei test.txt nicht gefunden.
Diese liegt im gleichen Ordner wie die Main Class.


----------



## Beni (9. Aug 2004)

Anonymous hat gesagt.:
			
		

> aber wie horizontal



Da muss man den "resizemode" vom Table anders setzen:

```
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
```

@pogo
Vielleicht musst du die Datei einen Ordner tiefer hinstellen oder so (zumindest bei Eclipse ist das so, damit man nicht *.class mit anderen Datei vermischen muss).


----------



## Guest (9. Aug 2004)

was ist der resizemode

und das mit der leiste und button geht nicht in der jtable/simpletable????


----------



## bygones (9. Aug 2004)

Beni hat gesagt.:
			
		

> (zumindest bei Eclipse ist das so, damit man nicht *.class mit anderen Datei vermischen muss).


trenn doch einfach src & class dateien so dass sie automatisch in unterschiedl. ordner liegen ?! (oder nicht thema ?)


----------



## Beni (9. Aug 2004)

Anonymous hat gesagt.:
			
		

> was ist der resizemode


Guck mal in der API unter "setAutoResizeMode" nach, dort steht alles wichtige.



			
				Anonymous hat gesagt.:
			
		

> und das mit der leiste und button geht nicht in der jtable/simpletable????


Natürlich geht das, muss man halt die Oberfläche leicht anders zusammenbauen. (z.B. dem Frame eine Menübar setzen...).

Entweder versteh ich dich falsch, oder du solltest noch ein Kapitel über graphische Oberflächen lesen 8) (z.B. hier oder hier (ist aber nicht so gut) (das ist zwar für AWT, aber die Grundprinzipien Swing-AWT sind gleich).


----------



## Guest (9. Aug 2004)

```
JMenuBar leiste=new JMenuBar();
    [size=18][size=24] [color=blue]JMenu menu1 =new JMenu("Datei");
     JMenuItem item1 =new JMenuItem("Neu");
     menu1.add(item1);
     leiste.add(menu1);
     setJMenuBar(leiste);[/color]     [/size][/size]
     Object rowData[][] =  (Object[][])input.toArray( new Object[ input.size() ][] ); 

     String  columnNames[] = { 
           "IDcyclist","fkIDteam","fkIDcountry","gene_sz_lastname","gene_sz_firstname","gene_sz_firstlastname",
"gene_i_birth_day","gene_i_birth_month","gene_i_birth_year","gene_i_age_decline","score_f_UCI",
"gene_ilist_fkIDtemp_favorite","gene_ilist_fkIDtemp_detestee","gene_ilist_fkIDweather_favorit",
"gene_ilist_fkIDweather_deteste","charac_f_plain","charac_f_mountain","charac_f_downhilling",
"charac_f_hill","charac_f_timetrial","charac_f_endurance","charac_f_resistance","charac_f_recuperation",
"charac_f_cobble","charac_f_agility","charac_f_sprint","charac_f_acceleration","value_i_potentiel" 
         }; 
         JTable table = new JTable( rowData, columnNames ); 
         JFrame frame = new JFrame(); 
         frame.getContentPane().add( new JScrollPane(table) );
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
         frame.pack(); 
         frame.setVisible( true );
```

und das geht nicht The method setJMenuBar(JMenuBar) is undefined for the type SimpleTable (
	
	
	
	





```
setJMenuBar(leiste);
```
)


_edit by thE_29: horizontal abgeteilt => zu lang => unübersichtlich_


----------



## Guest (9. Aug 2004)

> edit by thE_29: horizontal abgeteilt => zu lang => unübersichtlich



danke habe als gast keine edit funktion :cry:


----------



## bygones (9. Aug 2004)

Anonymous hat gesagt.:
			
		

> > edit by thE_29: horizontal abgeteilt => zu lang => unübersichtlich
> 
> 
> 
> danke habe als gast keine edit funktion :cry:


Dann wäre es doch mal angebracht sich anzumelden !!!


----------



## Beni (9. Aug 2004)

Anonymous hat gesagt.:
			
		

> und das geht nicht The method setJMenuBar(JMenuBar) is undefined for the type SimpleTable


Aber nicht beim JFrame, auf dem das Table sitzt...


----------



## Guest (9. Aug 2004)

was bedeutet ich muss um jtable noch ein jframe machen oder :bahnhof:


----------



## Beni (9. Aug 2004)

Ja, das würde etwa so aussehen:


```
JTable table = ...
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

         JFrame frame = new JFrame();
         frame.getContentPane().add( new JScrollPane(table) );

         JMenuBar bar = new JMenuBar();
         JMenu menu = new JMenu( "hallo" );
         menu.add( ... );

         frame.setJMenuBar( bar );

         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         frame.pack();
         frame.setVisible( true );
```


----------



## Guest (9. Aug 2004)

jo habe es schon rausbekommen habe nur vergessen frame. vor setJMenuBar(leiste) zu machen


----------



## pogo (9. Aug 2004)

Beni hat gesagt.:
			
		

> @pogo
> Vielleicht musst du die Datei einen Ordner tiefer hinstellen oder so (zumindest bei Eclipse ist das so, damit man nicht *.class mit anderen Datei vermischen muss).



Hab einfach den komletten Pfad eingetragen beim FileReader und schon ging es. :?:


----------



## Guest (9. Aug 2004)

jetzt fehlt nur noch 3 sachen wo ich aber erst mal 1. und 2. machen werde:

laden und speichern  
hab aus dem buch "jetzt lerne ich java"mal ein editor gemacht wo es auch laden und speichern gab
klar eine menüleiste habe ich schon wo laden und speicher drin ist also die neue methode laden:

```
void dateiLaden()
{
FileDialog d = new FileDialog(this,"Text laden...",FileDialog.LOAD);

d.show();
m_dateiname = d.getDirectory();
m_dateiname += d.getFile();

// Falls der Benutzer keine Datei ausgewählt hat, 
// wird null zurückgegeben
// Dann nichts weiter tun
if(m_dateiname == null)
	return;

// Einen Eingabestrom öffnen und die Datei laden
StringBuffer lesepuffer= new StringBuffer(ZEILEN * SPALTEN);
 
try
    {
    File eingabedatei = new File(m_dateiname);
    FileReader eingabe = new FileReader(eingabedatei);
        
    // solange Zeichen lesen, bis das Dateiende ( = -1) 
    // erreicht ist 
    char zeichen;
    int gelesen;
    int zeilen = 0;
    boolean weiter = true;

    while(weiter)
	  {
       gelesen = eingabe.read();
       if(gelesen == -1)
	     {
	     weiter = false;
	     continue;
	     }

     zeichen = (char) gelesen;
     lesepuffer.append( zeichen);
	}

   // Datei schließen
   eingabe.close();

   m_aktText = new String(lesepuffer);
   m_textanzeige.setText(m_aktText);	
   m_textanzeige.setCaretPosition(0);
   }

catch(EOFException e)
	{
	// auf diese Exception haben wir ja gewartet , nichts weiter tun. 
	}
catch(FileNotFoundException e)
	{
	System.out.println("Datei nicht vorhanden oder lesbar!\n");
	m_dateiname = null;    
	}
catch(IOException e)
	{
	// Sonst irgendwas ist schiefgegangen
	System.out.println("Fehler beim Lesen der Datei " + m_dateiname + 
              "\n");
	m_dateiname = null;
	}

} // Ende von 'dateiLaden'
```

aber so  einfügen in meinen code kann ich das nicht was muss ich vorher noch machen?? oder gibt es eine fertige methode dazu?


----------



## Guest (9. Aug 2004)

oder erst mal eine allgemeine frage:

ist es möglich die einzelen spalten nach größe anzuorden? zb oben 90 unten 0

wenn ich auf eine spalte klicke ein neues jtable öffnet in der nur daten drinstehen die den gleichen wert entsprechen wie aus der ersten jtable?
beispiel
erste tabelle                                2.tabelle
id_team     cdfeff                           id team    yxd
1               .1221    -->klick            1              212121

oder kuckst du hier 

http://www.cyclingmanager.de/phpbb/viewtopic.php?t=5866

_edited by thE_29: url tags repareiert_


----------



## Guest (9. Aug 2004)

:gaen: kann mir einer helfen :roll:    :cry:


----------



## pogo (9. Aug 2004)

Suchen
http://www.java-forum.org/de/viewtopic.php?t=1406&highlight=jtable+sort

oder hier unter Veränderung jTable
http://www.java-forum.org/de/viewtopic.php?t=5321#24019
und schon findet man das was man braucht


----------



## Guest (9. Aug 2004)

viel wichtiger ist das speichern und laden übers menü


----------



## Beni (9. Aug 2004)

Wieso kannst du das nicht einfügen, frag ich mich?

Die Methode irgendwo hinkopieren, wo sie erreichbar ist, den MenuItems ein ActionListener hinzufügen (addActionListener) und reagieren falls die der ActionListener anspricht.

guck hier


----------



## Guest (9. Aug 2004)

wenn ich void eingebe wird alles sofort unterstrichen


----------



## Guest (9. Aug 2004)

was heißt wo sie ereichbar ist???


----------



## Beni (9. Aug 2004)

Was? Wie? Du hast das schon in eine Klasse kopiert? Was den für eine Fehlerangabe?

Erreichbar meine ich: von der Methode "actionPerformed" des ActionListeners gibt es irgendwie eine Möglichkeit die Methode auch auch aufzurufen (sonst hats ja keinen Sinn).


----------



## Guest (9. Aug 2004)

als erstes in meinem code habe ich das lesen der datei  und das splitten
dann die menüs mit den Listener
dann habe ich die methode dateiLaden eingefügt
dan jtable
sieht so aus:


```
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class SimpleTable 
{ 
  public static void main( String[] args )throws IOException 
  { 
  	
  
     BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt")); 
     int gelesen; 
     String eingabezeile; 

     eingabezeile=eingabe.readLine(); 

     Vector input = new Vector();  // #### in diesem Vector speichern 

     while( eingabezeile != null ){ 
       StringTokenizer  token= new StringTokenizer (eingabezeile); 
      
       String[] felder =eingabezeile.split("\\|"); 
       //String[] token=eingabe.readLine(); 
       StringBuffer text =new StringBuffer(10); 
        
       input.add( felder ); 

       //StringTokenizer tokens =new StringTokenizer(token.split("|")); 
       eingabezeile=eingabe.readLine(); 
        
     } 
     

     boolean ende =false; 
     
     JMenuBar leiste=new JMenuBar();
     JMenu menu1 =new JMenu("Datei");
     JMenuItem item1 =new JMenuItem("Laden");
     JMenuItem item2=new JMenuItem("Speichern");
     menu1.add(item1);
     menu1.add(item2);
     leiste.add(menu1);
    
     class CMeinActionLauscher implements ActionListener
	 {
     	public void actionPerformed(ActionEvent e)
        {
        String label;

        label = e.getActionCommand();

        if(label.equals("Datei laden"))
  	     dateiLaden();

        if(label.equals("Datei speichern"))
  	     dateiSpeichern();

            
        }   
	 }

     void dateiLaden()
     {
     FileDialog d = new FileDialog(this,"Text laden...",FileDialog.LOAD);

     d.show();
     m_dateiname = d.getDirectory();
     m_dateiname += d.getFile();

//      Falls der Benutzer keine Datei ausgewählt hat, 
//      wird null zurückgegeben
//      Dann nichts weiter tun
     if(m_dateiname == null)
     	return;

//      Einen Eingabestrom öffnen und die Datei laden
     StringBuffer lesepuffer= new StringBuffer(ZEILEN * SPALTEN);
      
     try
         {
         File eingabedatei = new File(m_dateiname);
         FileReader eingabe = new FileReader(eingabedatei);
             
         // solange Zeichen lesen, bis das Dateiende ( = -1) 
         // erreicht ist 
         char zeichen;
         int gelesen;
         int zeilen = 0;
         boolean weiter = true;

         while(weiter)
     	  {
            gelesen = eingabe.read();
            if(gelesen == -1)
     	     {
     	     weiter = false;
     	     continue;
     	     }

          zeichen = (char) gelesen;
          lesepuffer.append( zeichen);
     	}

        // Datei schließen
        eingabe.close();

        m_aktText = new String(lesepuffer);
        m_textanzeige.setText(m_aktText);	
        m_textanzeige.setCaretPosition(0);
        }

     catch(EOFException e)
     	{
     	// auf diese Exception haben wir ja gewartet , nichts weiter tun. 
     	}
     catch(FileNotFoundException e)
     	{
     	System.out.println("Datei nicht vorhanden oder lesbar!\n");
     	m_dateiname = null;    
     	}
     catch(IOException e)
     	{
     	// Sonst irgendwas ist schiefgegangen
     	System.out.println("Fehler beim Lesen der Datei " + m_dateiname + 
                   "\n");
     	m_dateiname = null;
     	}

     } // Ende von 'dateiLaden' 
     
     Object rowData[][] =  (Object[][])input.toArray( new Object[ input.size() ][] ); 

     String  columnNames[] = { 
           "blabla" 
         }; 
    
         JTable table = new JTable( rowData, columnNames ); 
         JFrame frame = new JFrame(); 
         frame.getContentPane().add( new JScrollPane(table) );
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
         frame.pack(); 
         frame.setVisible( true );
         frame.setJMenuBar(leiste);
         table.setAutoCreateColumnsFromModel(false);    

  } 
}
```


void ist unterstrichen als syntax error  on tokken void,new expected     und  von () bis d.show als syntax error,misplaced constructor    

und noch    }  am ende von dateiladen syntaks error delete this tokken :bahnhof:


----------



## Beni (9. Aug 2004)

Du hast die Methode innerhalb einer anderen Methode geschrieben. Das geht nicht (überprüf mal wieviele "{" und wieviele "}" du wo hast).

Als Grundgerüst (ist nur ein Vorschlag) kannst du sowas bauen:

```
public class SimpleTable{
  public static void main( String[] args ){
    new SimpleTable();
  }

  // [... irgendwelche Variablen ]

  public SimpleTable(){
     [...]

     menuItemLaden.addActionListener( new ActionListener(){ 
        public void actionPerformed( ActionEvent e ){ 
           dateiLaden();
        }
     };
  }

  public void dateiLaden(){
  }
}
```


----------



## Guest (9. Aug 2004)

danke erstmal habe es jetzt so angeordnet wie vorgeschlagen jetzt gibt es probs bei der eingabe 
kann es sein das throws IOException  nicht mit übernommen wurde???

```
public class SimpleTable 
{ 
  public static void main( String[] args )throws IOException 
  { 
  	new SimpleTable();
  }
  private String m_dateiname;           // zu ladende/speichernde Datei
  private String m_aktText;      // aktueller Text in der TextArea
  private CTextAnzeige m_textanzeige;   // die eigentliche TextArea
  private JComboBox m_fonts,m_styles;     // Auswahl von Fonttyp, Stil und
  private JComboBox m_farben;           // Farbe
  private Hashtable m_befehle;
  final int ZEILEN  = 100;
  final int SPALTEN = 400;
  public SimpleTable()
  {
     BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt")); 
     int gelesen; 
     String eingabezeile; 
     
     eingabezeile=eingabe.readLine(); 

     Vector input = new Vector();  // #### in diesem Vector speichern 

     while( eingabezeile != null ){ 
       StringTokenizer  token= new StringTokenizer (eingabezeile); 
      
       String[] felder =eingabezeile.split("\\|"); 
       //String[] token=eingabe.readLine(); 
       StringBuffer text =new StringBuffer(10); 
        
       input.add( felder ); 

       //StringTokenizer tokens =new StringTokenizer(token.split("|")); 
       eingabezeile=eingabe.readLine();
```


----------



## Beni (9. Aug 2004)

Anonymous hat gesagt.:
			
		

> danke erstmal habe es jetzt so angeordnet wie vorgeschlagen jetzt gibt es probs bei der eingabe
> kann es sein das throws IOException  nicht mit übernommen wurde???



Ja, kann schon sein. Musst du halt noch hinschreiben :wink:


----------



## Guest (9. Aug 2004)

ist schon ok habe IOException einfach hinter public SimpleTable() gesetzt  

jetzt ist nur noch ein fehler da bei FileDialog d = new FileDialog(this,"Text laden...",FileDialog.LOAD); the constructor FileDialog (SimpleTable,String,int) is undefinend


----------



## Guest (9. Aug 2004)

kann das prog aber starten nur wird es 1000 mal :shock:  ausgeführt


----------



## Beni (9. Aug 2004)

Edit: zum FileDialog:

Tja, in der API (genau hier) nachgucken und scharf nachdenken


----------



## Guest (9. Aug 2004)

ich gehe mal davon aus das der erste wert in constructor die tabelle sein muss wo er den filedialog öffnet dieses this bezieht sich ja auf simpletable!
richtig müsste da ja der jtable name hin oder???

wenn ich den angebe steht das er nicht gefunden wurde was sich damit erklärt das eer in einer anderen klasse steht


----------



## pogo (10. Aug 2004)

da steht doch Frame parent und nicht this!


----------



## Guest (10. Aug 2004)

```
FileDialog d = new FileDialog(this,"Text laden...",FileDialog.LOAD);
```
                                                   :roll:  :toll:


----------



## Guest (10. Aug 2004)

das ladefenster kommt jetzt habe das einfach gemacht:

```
JFrame frame2 = new JFrame();
FileDialog d = new FileDialog(  frame2,"Text laden...",FileDialog.LOAD);
```

aber wird nichts in mein jtable geladen woran kann das liegen?


----------



## Beni (10. Aug 2004)

Ich hätte ja dieses Fenster:

```
JFrame frame = new JFrame();  // ### das hier

         frame.getContentPane().add( new JScrollPane(table) );
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         frame.pack();
         frame.setVisible( true );
         frame.setJMenuBar(leiste);
         table.setAutoCreateColumnsFromModel(false);
```
genommen...(hätte man noch irgendwo als Instanzvariable speichern müssen). Aber egal :wink:



Wieso sollte überhaupt etwas in das JTable geladen werden? Denn die Methode "dateiLaden", wie sie oben geschrieben ist, liest zuerstmal eine Datei aus (sofern eine gewählt wurde), und schreibt den Inhalt in ein Textfeld (m_textanzeige).

Ich nehm mal an, das hast du unterdessen abgeändert :wink:, wie sieht sie denn die neuste Version aus?

Grundsätzlich liest du die Daten aus, machst ein TableModel draus (guck mal unter "DefaultTableModel", da findest du sicher was brauchbares) und übrgibst dem JTable dieses Model mit JTable#setModel.


----------



## Guest (10. Aug 2004)

die datei die geladen wird ist unübersichtlich und deswgen wollte ich sie bei den einzelen | splitten 
das hat ja auch alles geklappt !
nur will ich es einfacherhalbe so machen das man die datei selbst auswehelen kann über ein menü in der jtable

was ich mich jetzt js frage ist : kann das erste mit dem filereader jetzt nicht eigentlich weg? 
hier mein aktueller code:

```
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.Action;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.text.DefaultEditorKit;


public class SimpleTable 
{ 
  public static void main( String[] args )throws IOException 
  { 
  	new SimpleTable();
  }
  private String m_dateiname;           // zu ladende/speichernde Datei
  private String m_aktText;      // aktueller Text in der TextArea
  private CTextAnzeige m_textanzeige;   // die eigentliche TextArea
  private JComboBox m_fonts,m_styles;     // Auswahl von Fonttyp, Stil und
  private JComboBox m_farben;           // Farbe
  private Hashtable m_befehle;
  final int ZEILEN  = 100;
  final int SPALTEN = 400;
  public  SimpleTable()throws IOException 
  {
     BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt")); 
     int gelesen; 
     String eingabezeile; 
     
     eingabezeile=eingabe.readLine(); 

     Vector input = new Vector();  // #### in diesem Vector speichern 

     while( eingabezeile != null ){ 
       StringTokenizer  token= new StringTokenizer (eingabezeile); 
      
       String[] felder =eingabezeile.split("\\|"); 
       //String[] token=eingabe.readLine(); 
       StringBuffer text =new StringBuffer(10); 
        
       input.add( felder ); 

       //StringTokenizer tokens =new StringTokenizer(token.split("|")); 
       eingabezeile=eingabe.readLine(); 
     }
        
    
 
     
     JMenuBar leiste=new JMenuBar();
     JMenu menu1 =new JMenu("Datei");
     JMenuItem item1 =new JMenuItem("Laden");
     JMenuItem item2=new JMenuItem("Speichern");
     menu1.add(item1);
     menu1.add(item2);
     leiste.add(menu1);
     Object rowData[][] =  (Object[][])input.toArray( new Object[ input.size() ][] ); 

     String  columnNames[] = { 
           
         }; 
    
         JTable table = new JTable( rowData, columnNames ); 
         JFrame frame = new JFrame(); 
        
         frame.getContentPane().add( new JScrollPane(table) );
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
         frame.pack(); 
         frame.setVisible( true );
         frame.setJMenuBar(leiste);
         table.setAutoCreateColumnsFromModel(false); 

     //boolean ende =false; 
         class CMeinItemAdapter implements ItemListener
		   {                                         
		   public void itemStateChanged(ItemEvent e)
		      {
		      //fontAktualisieren();
		      }   
		   } 
         class CMeinWindowAdapter extends WindowAdapter
		   {
		   public void windowClosing(WindowEvent e)
			{
			System.exit(0);
			}
		   }
    
     class CMeinActionLauscher implements ActionListener
	 {
     	public void actionPerformed(ActionEvent e)
        {
        String label;

        label = e.getActionCommand();

        if(label.equals("Laden"))
  	     dateiLaden();
        	
        /*if(label.equals("Datei speichern"))
  	     dateiSpeichern();*/

            
        }   
	 }
     //addWindowListener(new CMeinWindowAdapter()); 

//   Die Instanz der Adapterklasse für den ActionListener brauchen
//   wir mehrmals, daher erzeugen wir nur eine Instanz und                            
//   verwenden sie mehrfach; das spart ein bißchen Speicher
  CMeinActionLauscher  actionlistener = new CMeinActionLauscher();
  item1.addActionListener(actionlistener);
 

//   Genauso bei dem Lauschobjekt für die Items
  CMeinItemAdapter itemlistener = new CMeinItemAdapter();
  m_fonts.addItemListener(itemlistener);
  m_styles.addItemListener(itemlistener);
  m_farben.addItemListener(itemlistener);


//   Befehle für die Zwischenablage
//   erzeuge Action-Tabelle
   m_befehle = new Hashtable();
   Action[] actionsArray = m_textanzeige.getActions();
   for (int i = 0; i < actionsArray.length; i++) {
       Action a = actionsArray[i];
       m_befehle.put(a.getValue(Action.NAME), a);
   }

  item1.addActionListener((Action) m_befehle.get(DefaultEditorKit.cutAction));
  
  } // Ende von Konstruktor 'CEditor' 

     
     
        
     
   

void dateiLaden()
{
	 JFrame frame2 = new JFrame();
FileDialog d = new FileDialog(  frame2,"Text laden...",FileDialog.LOAD);

d.show();
m_dateiname = d.getDirectory();
m_dateiname += d.getFile();

// Falls der Benutzer keine Datei ausgewählt hat, 
// wird null zurückgegeben
// Dann nichts weiter tun
if(m_dateiname == null)
	return;

// Einen Eingabestrom öffnen und die Datei laden
StringBuffer lesepuffer= new StringBuffer(ZEILEN * SPALTEN);
 
try
    {
    File eingabedatei = new File(m_dateiname);
    FileReader eingabe = new FileReader(eingabedatei);
        
    // solange Zeichen lesen, bis das Dateiende ( = -1) 
    // erreicht ist 
    char zeichen;
    int gelesen;
    int zeilen = 0;
    boolean weiter = true;

    while(weiter)
	  {
       gelesen = eingabe.read();
       if(gelesen == -1)
	     {
	     weiter = false;
	     continue;
	     }

     zeichen = (char) gelesen;
     lesepuffer.append( zeichen);
	}

   // Datei schließen
   eingabe.close();

   m_aktText = new String(lesepuffer);
  
   }

catch(EOFException e)
	{
	// auf diese Exception haben wir ja gewartet , nichts weiter tun. 
	}
catch(FileNotFoundException e)
	{
	System.out.println("Datei nicht vorhanden oder lesbar!\n");
	m_dateiname = null;    
	}
catch(IOException e)
	{
	// Sonst irgendwas ist schiefgegangen
	System.out.println("Fehler beim Lesen der Datei " + m_dateiname + 
              "\n");
	m_dateiname = null;
	}

} //Ende von 'dateiLaden' 
}
```


----------



## Beni (10. Aug 2004)

Also irgendwie hab ich das Gefühl, dir fehlen noch was :wink: :
1. Gewöhn dir dringenst an, den Code einzurücken. Pro "{" gehts "  " weiter rein (und nach einem "}" wieder raus). Das wird 1000* übersichtlicher (kann sein, dass das Forum da ein bisschen dreinfunkt).
2. Ich hab versucht deinen Code zu starten. Bereits bei Start gibts eine Exception nach der anderen. Entweder hast du einige Teile einfach nicht gepostet, oder du hast Dir diesen Code irgendwie aus dem Internet zusammenkopiert.
3. Die Probleme die Du hast deuten, jedenfalls für mich, darauf hin, dass einige (Grund-)konzepte noch nicht in deinem Blut sind.

Kann sein, dass ich mich irre, aber falls nicht:
Beginn nocheinmal von vorne mit diesem kleinen Projekt.

Dabei überlegst du dir schon bevor du zu schreiben beginnst: "was soll das Progi alles können". Dann hast du später kein Problem mit "wo füg ich jetzt das noch ein?".
Mach eine kleine Skizze, welche Methode was macht, und was sie dazu alles benötigt. So kannst du besser ausarbeiten, welche Variable wohin gehört. (Und denk daran: eine Methode macht nur eine Arbeit. Eine baut das Menü, eine wählt eine Datei aus und reicht diese Datei weiter an die Methode die die Datei lädt...)

Dann setzt du dich an die Tastatur und beginnst. Du kannst Code aus dem alten Projekt kopieren, wenn du weisst, dass dieser Teil richtig funktioniert hat. Den Rest schreibst Du nocheinmal.

Bei jedem Buchstaben den Du tipps überlegst du: macht es Sinn hier ein _ zu schreiben? Wird die Variable nur in dieser Methode benötigt, oder auch noch woanders? Sollte und kann man diesen Code vielleicht auf mehrere Methoden verteilen? Funktioniert das in jedem Fall, oder stürzt das Progi an dieser Stelle vielleicht ab? ...


*Falls du das für unnötig erachtest, schreib ich halt, wie Du vielleicht mit deinem aktuellen Code weiterkommst.*

Du kannst ja bereits Dateien auslesen und in Tabellen verwandeln, im Konstruktor von SimpleTable. Am besten nimmst du jetzt einen Teil dieses Codes und kopierst ihn dorthin, wo die (vom Benutzer ausgewählte) Datei geladen wird (und das ist die Method "dateiLaden"). Dann sind ein paar Sachen in dieser Methode doppelt vorhanden, also musst du ordentlich den "delete"-Knopf benutzen, bis alles Überflüssige weg ist (so ziemlich der Ganze Inhalt der Methode, wie sie jetzt gerade ist 8) ).
Da du dort das JTable dort noch nicht erreichen kannst, verschiebst du die Variable "table", und machst eine Instanzvariable aus ihr.

Also aus

```
public class SimpleTable
  public SimpleTable(){
    JTable table = new JTable...
```
wird

```
public class SimpleTable
  private JTable table;  // Instanzvariable
  public SimpleTable(){
    table = new JTable...
```

Da du nicht bei jedem Laden einer Datei ein neues JTable erzeugen solltest (weil sonst Geschwindigkeit des Progis = 0), verwendest du (beim Laden einer neuen Datei!!) _nicht_

```
JTable table = new JTable( rowData, columnNames );
```

sondern du benutzt ein TableModel

```
table.setModel(  new DefaultTableModel( rowData, columnNames ));
```

Dann musst du auch nicht die Oberfläche neu zusammenbauen.


Und noch was:

```
m_dateiname = d.getDirectory();
m_dateiname += d.getFile();
```

Du bekommst mit "d.getFile" bereits die Datei. Wenn du da noch was davorsetzt, baust du dir einen ungültigen Pfad zusammen. (also eine der beiden Zeilen ist zuviel :wink: ).


----------



## Guest (10. Aug 2004)

danke erstmal für den ratschlag  
ich werde das auch neu machen nur will ich versuchen das prog lauffähig zu machen  

habe jetzt am anfang das geändet:

```
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Hashtable;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.Action;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.DefaultEditorKit;


public class SimpleTable 
{

  
  public static void main( String[] args )throws IOException 
  { 
  	new SimpleTable();
  }
  private String m_dateiname;           // zu ladende/speichernde Datei
  private String m_aktText;      // aktueller Text in der TextArea
  private CTextAnzeige m_textanzeige;   // die eigentliche TextArea
  private JComboBox m_fonts,m_styles;     // Auswahl von Fonttyp, Stil und
  private JComboBox m_farben;           // Farbe
  private Hashtable m_befehle;
  final int ZEILEN  = 100;
  final int SPALTEN = 400;
  private JTable table;  // Instanzvariable 
  public SimpleTable ()throws IOException 
  {
```


wenn ich das IOException  wegmache kommen fehlermeldungen :cry: 
jetzt habe ich beim laden folgendes:

```
FileDialog d = new FileDialog(  table,"Text laden...",FileDialog.LOAD);
```

doch da macht der constructor wieder nicht mit


----------



## Guest (11. Aug 2004)

oh man habe schon alles ausprobiert bekomme es aber nicht hin  :!: 
was soll ih den bloss in diesen construktor eingeben


----------



## Guest (13. Aug 2004)

habe mich jetzt entschlossen den filedialog wegzulassen und einfach in einer datei zu schreiben :

```
public class Editor
{

  
  public static void main( String[] args )throws IOException 
  { 
  
  	
     BufferedReader eingabe = new BufferedReader(new FileReader("DYN_cyclist.txt")); 
     int gelesen; 
     String eingabezeile; 
     
     eingabezeile=eingabe.readLine(); 

     Vector input = new Vector();  // #### in diesem Vector speichern 

     while( eingabezeile != null )
     { 
     	StringTokenizer  token= new StringTokenizer (eingabezeile); 
      
     	String[] felder =eingabezeile.split("\\|"); 
       
     	StringBuffer text =new StringBuffer(10); 
       	input.add( felder ); 
       	eingabezeile=eingabe.readLine(); 
     
     }
        
    
     JMenuBar leiste=new JMenuBar();
     JMenu menu1 =new JMenu("Datei");
     JMenuItem item1 =new JMenuItem("Laden");
     JMenuItem item2=new JMenuItem("Speichern");
     menu1.add(item1);
     menu1.add(item2);
     leiste.add(menu1);
     Object rowData[][] =  (Object[][])input.toArray( new Object[ input.size() ][] ); 

     String  columnNames[] = { 
      "IDcyclist","fkIDteam","fkIDcountry","gene_sz_lastname","gene_sz_firstname","gene_sz_firstlastname",
     "gene_i_birth_day","gene_i_birth_month","gene_i_birth_year","gene_i_age_decline","score_f_UCI",
     "gene_ilist_fkIDtemp_favorite","gene_ilist_fkIDtemp_detestee","gene_ilist_fkIDweather_favorit",
     "gene_ilist_fkIDweather_deteste","charac_f_plain","charac_f_mountain","charac_f_downhilling","charac_f_hill",
     "charac_f_timetrial","charac_f_endurance","charac_f_resistance","charac_f_recuperation","charac_f_cobble",
     "charac_f_agility","charac_f_sprint","charac_f_acceleration","value_i_potentiel" 
         }; 
    
     	 JTable table = new JTable( rowData, columnNames ); 
         JFrame frame = new JFrame(); 
        
         frame.getContentPane().add( new JScrollPane(table) );
         table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
         frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
         frame.pack(); 
         frame.setVisible( true );
         frame.setJMenuBar(leiste);
         table.setAutoCreateColumnsFromModel(false); 
         
       File Datei =new File("test2.txt");
      FileWriter ausgabestrom=new FileWriter(Datei);
      PrintWriter ausgabe=new PrintWriter(ausgabestrom);
      ausgabe.print(rowData);
      ausgabe.println();
      ausgabe.close();
      
  }
}
```

wie bekomme ich es jetzt hin die in der jtable bearbeiteten sachen so zu speichern????
ich werde es aber noch so machen das mach im menü auf speichern geht und dan in test.txt speichert

[Edit by foobar: Zeilenumbrüche eingefügt]


----------



## Guest (19. Sep 2004)

```
public boolean writeTable(ModelTable table) {
		boolean p = true;

		String s = new String();
		for (int i = 0; i < table.getRowCount(); i++) {
			s = (String) table.getValueAt(i, 0) + "|"
					+ (String) table.getValueAt(i, 1) + "|"
					+ (String) table.getValueAt(i, 2) + "|"
					+ (String) table.getValueAt(i, 3) + "|"
					+ (String) table.getValueAt(i, 4) + "|";

			try {
				aWriter.write(s);
				aWriter.newLine();
			} catch (IOException ex) {
				p = false;
			}
		}

		return p;

	}
```

Ich bekomme beim compilieren immer eine NullPointerException bei  "  aWriter.write(s); ".
Wer kann mir weiterhelfen?


----------



## Illuvatar (20. Sep 2004)

Die kriegst du unter Garantie nicht beim Kompilieren.
Und das heißt dass aWriter null ist.

Edit: GRMPF und jetzt les ich dass es ein Doppelpost ist :x


----------

