Array in jTable einlesen (aus txt-Datei)

simoasis

Grünschnabel
Ich möchte die unten erzeugten Sachen, welche mittels Tokenizer getrennt werden, in ein Tabelle einlesen. (jTable)
Wie schaffe ich das der Inhalt des Arrays in eine GUI Tabelle eingepflegt wird und zwar automatisch
Ich wär besonders dankbar für ein komplettes Skript, dass dieses Problem behebt.
Hier das Beispiel:

Source-Code:
Code:
import java.io.*;
import java.util.*;
import java.lang.*;

public class Main {
      
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        
        // Aufruf der GUI
        GUI t = new GUI();
        t.setSize(800,600);
        t.show();
               
        // Array für Aktien erzeugen
        Aktie depot[] = new Aktie[50];
        int aktienzaehler = 0;
        try {
            String zeile;

            //Wir lesen aus "Aktien.txt".
            File eingabeDatei = new File("Pfadangabe+txt-File");
            FileReader eingabeStrom = new FileReader(eingabeDatei);
            BufferedReader eingabe = new BufferedReader(eingabeStrom);

                   
            while ((zeile = eingabe.readLine()) != null)
            {
                //einlesen einer Aktie mit allen Werten
                StringTokenizer st = new StringTokenizer(zeile, ";");
                String name = st.nextToken();
                String wknummer = st.nextToken();
                String tageskurs = st.nextToken();
                String anz = st.nextToken();
                
                //parsen der WKN, des Kurses und der Anzahl, damit
                //das keine Strings mehr sind und man damit rechnen kann
                int wkn = Integer.parseInt(wknummer);
                float kurs = Float.parseFloat(tageskurs);
                int anzahl = Integer.parseInt(anz);
                
                // Aktienarray füllen              
                Aktie neu = new Aktie(name,wkn,kurs,anzahl);
                depot[aktienzaehler]=neu;
                aktienzaehler++;                
            }
           
            //System.out.println(eingabe.readLine());
        } catch (IOException e) {
            e.printStackTrace();
           
        }
        catch (NoSuchElementException n) {
            n.printStackTrace();
        }
        int i=0;
        while (depot[i]!=null){
            System.out.println(depot[i].Name + "\t\t"+depot[i].kurs + "\t" + depot[i].anzahl);
            i++;
        }      
   }
}

Gruß
Simon
 
Original geschrieben von simoasis
Ich möchte die unten erzeugten Sachen, welche mittels Tokenizer getrennt werden, in ein Tabelle einlesen. (jTable)
Wie schaffe ich das der Inhalt des Arrays in eine GUI Tabelle eingepflegt wird und zwar automatisch
Ich wär besonders dankbar für ein komplettes Skript, dass dieses Problem behebt.
Hier das Beispiel:

C U T

Gruß
Simon

Ich hasse es, wenn jemand den vollständigen Code postet oder eine Lösung als vollständigen Code haben möchte. Beschreibe lieber genau, wo es klemmt. Das ist für beide Seiten hilfreicher als blanker Code, der falsch ist oder den Du evtl. nicht verstehst.

Wo genau liegt das Problem? Beim Parsen der Textdatei oder bei der Übertragung in die Tabelle?
 
ok ok ok
dann weiß ich's fürs nächste mal.

das problem besteht jetzt aber darin:
wie bekomme ich die sachen die ich über ne txt datei einlese in ein jtable eingelesen?
 
Original geschrieben von simoasis
ok ok ok
dann weiß ich's fürs nächste mal.

das problem besteht jetzt aber darin:
wie bekomme ich die sachen die ich über ne txt datei einlese in ein jtable eingelesen?

Red ich chinesisch? Wo GENAU liegt das Problem? Das Parsen der Textdatei oder die Übernahme in die Tabelle? Also liegen die Daten schon irgendwo vor und müssen nur noch in die Tabelle "reingequetscht" werden oder klemmt es schon beim Einlesen der Daten aus der Textdatei?
 
also ich versuch nochmals zu beschreiben, wo das problem liegt:

ich hab derzeit ne txt-datei erstellt die in etwa so aufgebaut ist:
123541.;bluppblabla;blabluppbla;0
bluppblabla.;blablabla;123435;blablabla
blabla.;760080;blablabla;blablablupp

es steht halt was drin und die einzelnen sachen sind durch ; getrennt
dies les ich dann mit nem tokenizer / filereader / bufferreader aus
(es kommt dann auch über system.out.println raus.
soweit läuft alles.

jetzt möchte ich dieses textfile (siehe oben) aber nicht über ein output window ausgeben, sondern es soll in einer GUI in einer tabelle ausgegeben werden, dh ein jtable soll sich mit dem inhalt des textfiles füllen
im beispiel oben (inhalt der txt-datei) sollte dann ein tabelle mit 3 zeilen und 4 spalten entstehen)
 
Hallo!

Versuchs mal hiermit:

Spaltenanzahl muss bei allen Datensatzen gleich sein ...

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

/*
 * FileImport.java
 *
 * Created on 14. April 2004, 14:16
 */

/**
 *
 * @author  Darimont
 */
public class FileImport extends JFrame {

	private BufferedReader br;
	private File importFile;
	private JFileChooser chooser;
	private FileImport _this;
	private volatile boolean importRunning = false;
	private DefaultTableModel model;

	/** Creates new form FileImport */
	public FileImport() {
		initComponents();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		_this = this;
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	private void initComponents() {
		java.awt.GridBagConstraints gridBagConstraints;

		bgPanel = new JPanel();
		tablePanel = new JPanel();
		scrollPane = new JScrollPane();
		jTable1 = new JTable();
		controlsPanel = new JPanel();
		btnChoseFile = new JButton();
		txtPath = new JTextField();
		btnImport = new JButton();
		lblPath = new JLabel();
		lblDelimiter = new JLabel();
		txtDelimiter = new JTextField();

		getContentPane().setLayout(new java.awt.FlowLayout());

		setTitle("FileImport");

		bgPanel.setLayout(new java.awt.GridBagLayout());

		
		bgPanel.setMinimumSize(new java.awt.Dimension(400, 300));
		bgPanel.setPreferredSize(new java.awt.Dimension(400, 300));
		
		tablePanel.setMinimumSize(new java.awt.Dimension(400, 200));
		tablePanel.setPreferredSize(new java.awt.Dimension(400, 200));
		scrollPane.setMinimumSize(new java.awt.Dimension(400, 200));
		scrollPane.setPreferredSize(new java.awt.Dimension(400, 200));

		jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		scrollPane.setViewportView(jTable1);

		tablePanel.add(scrollPane);

		bgPanel.add(tablePanel, new java.awt.GridBagConstraints());

		controlsPanel.setLayout(new java.awt.GridBagLayout());

		controlsPanel.setMinimumSize(new java.awt.Dimension(400, 100));
		controlsPanel.setPreferredSize(new java.awt.Dimension(400, 100));
		btnChoseFile.setText("Chose File");
		btnChoseFile.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnChoseFileActionPerformed(evt);
			}
		});

		controlsPanel.add(btnChoseFile, new java.awt.GridBagConstraints());

		txtPath.setColumns(20);
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.gridy = 1;
		controlsPanel.add(txtPath, gridBagConstraints);

		btnImport.setText("Import");
		btnImport.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnImportActionPerformed(evt);
			}
		});

		controlsPanel.add(btnImport, new java.awt.GridBagConstraints());

		lblPath.setText("Path: ");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 1;
		controlsPanel.add(lblPath, gridBagConstraints);

		lblDelimiter.setText("Delimiter: ");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 2;
		controlsPanel.add(lblDelimiter, gridBagConstraints);

		txtDelimiter.setColumns(3);
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.gridy = 2;
		controlsPanel.add(txtDelimiter, gridBagConstraints);

		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 1;
		bgPanel.add(controlsPanel, gridBagConstraints);

		getContentPane().add(bgPanel);

		pack();
	}

	private void btnImportActionPerformed(java.awt.event.ActionEvent evt) {
		// Add your handling code here:
		if (importFile != null)
			if (!importRunning) {

				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						doImport(importFile);
					}
				});
			} else {
				System.out.println("Still importing ... ");
			}
	}

	/**
	 * @param importFile
	 */
	protected void doImport(File importFile) {
		// TODO Auto-generated method stub
		String delimiter = txtDelimiter.getText();
		if (delimiter == null || !delimiter.equals(""))
			delimiter = ";";
		try {
			br = new BufferedReader(new FileReader(importFile));

			ArrayList rows = new ArrayList();
			Object[] clmHeaders = null;

			String line = null;
			StringTokenizer tokenizer = null;

			int tCnt = -1;

			while ((line = br.readLine()) != null) {
				tokenizer = new StringTokenizer(line, delimiter);
				tCnt = tokenizer.countTokens();
				Object[] rowData = new Object[tCnt];
				int i = 0;
				while (tokenizer.hasMoreTokens())
					rowData[i++] = tokenizer.nextToken();
				rows.add(rowData);
			}

			clmHeaders = new Object[((Object[]) rows.get(0)).length];

			for (int i = 0; i < clmHeaders.length; i++) {
				clmHeaders[i] = "Column" + i;
			}

			Object[][] oArray = new Object[tCnt][];
			int lstSize = rows.size();
			for (int i = 0; i < lstSize; i++)
				oArray[i] = (Object[]) rows.get(i);

			model = new DefaultTableModel(oArray, clmHeaders);

			jTable1.setModel(model);
			jTable1.updateUI();

			System.out.println("Import complete!");

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void btnChoseFileActionPerformed(java.awt.event.ActionEvent evt) {
		// Add your handling code here:
		if (chooser == null)
			chooser =
				new JFileChooser(new File(System.getProperty("user.dir")));

		chooser.showDialog(this, "load");
		importFile = chooser.getSelectedFile();
		if (importFile != null)
			txtPath.setText(importFile.getAbsolutePath());
	}

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		new FileImport().show();
	}

	// Variables declaration - do not modify
	private JButton btnChoseFile;
	private JButton btnImport;
	private JPanel bgPanel;
	private JPanel tablePanel;
	private JPanel controlsPanel;
	private JScrollPane scrollPane;
	private JTable jTable1;
	private JLabel lblDelimiter;
	private JLabel lblPath;
	private JTextField txtDelimiter;
	private JTextField txtPath;
	// End of variables declaration

}

Gruß Tom
 
OK.
In groben Zügen für eine saubere (!) Implementierung, die Du in dieser Form immer wieder durchführen kannst:
1. Erzeuge Dir eine Klasse, die Du vom DefaultTableModel ableitest (z.B. MyTableModel)
2. Darin legst Du eine Instanzvariable myData[] an
3. In dieser Klasse implementierst Du die Methoden
- getColumnCount () und lieferst dort die Anzahl der auszulesenden Spalten zurück, also das, was Dein Aktie-Objekt ausmacht
- getColumnName() und lieferst hier den Spaltennamen zurück. Das kann als Instanzvariable als Stringarray bereitgehalten werden
- getRowCount() lieferst Du die Länge des Aktie-Arrays zurück
- getValueAt() liefert dann aus Deinem Aktie-Array myData das anzuzeigende Objekt (üblicherweise Integer oder String) für die Spalte und die Zeile
- Implementiere eine Methode, die myData[] setzt, z.B.
public void setMyData(Aktie aktien[])
{
myData = aktien;
}
4. Achte darauf, dass die o.a. Methoden in jedem Fall etwas zurückgeben!
5. Erzeuge eine Instanz Deines TableModels dort, wo die Tabelle verwaltet wird.
MyTableModel myTableModel = new MyTableModel();
6. Weise dieses TableModel Deiner JTable zu, z.B. myJTable.setModel(myTableModel);
7. Lies die Textdatei wie gehabt in Dein Array ein.
8. Hinterlege das eingelesene Array Deinem TableModel per
myJTable.getModel().setMyData(aktien);
9. Sorge dafür, dass sich die Tabelle aktualisiert. Entweder
myJTable.getModel().fireTableDataChanged(); oder in setMyData(), wo es eigentlich hingehört:
public void setMyData(Aktie aktien[])
{
myData = aktien;
fireTableDataChanged();
}

All das kann ggf. zu Problemen führen wegen des Arrays. Praktischer wäre die Verwendung einer ArrayList.
 
danke danke
das mit dem import funktioniert ja wunderbar
auch die andere anleitung ist mir eine hilfe
nochmals danke für die mitarbeit
 
Original geschrieben von Thomas Darimont
Hallo!

Versuchs mal hiermit:

Spaltenanzahl muss bei allen Datensatzen gleich sein ...

Code:
import java.io.BufferedReader;


Gruß Tom

Hallo Tom,
Deine Hilfsbereitschaft in allen Ehren - meinst Du nicht, dass es hilfreicher ist, den Lösungsweg zu erklären, so dass sich der Fragesteller den konkreten Code selbst erarbeiten kann, anstatt unzählige Zeilen unkommentierten (!) Code zu posten?
 
Hallo Snape!

Du hast dem Kollegen doch schon en Detail erklärt, was er machen muss. Ich hab nur ein praktisches Beispiel dazu abgeliefert. Ich denke, wenn man was mit Java Programmierung zu tun haben will muss man sich auch ein wenig angehwöhnen den Code lesen zu können. Weiterhin glaube ich das die wirklich wichtigen Methoden (doImport) etc. auch so "entziffert" werden können.

Gruß Tom
 

Neue Beiträge

Zurück