Swing JTable Datenimport von JTextFields

Status
Nicht offen für weitere Antworten.

Colt45

Aktives Mitglied
Mahlzeit, bin relativ neu hier und auch noch nicht sehr versiert im Umgang mit Java.
zum Konzept: Ich bin DJ und wollte mir ein kleines Programm schreiben, wo ich oben 4 JTextFields habe, in die ich Name, Titel usw eingeb, dann auf nen Button klick, der mir die Daten dann in eine JTable haut. Da ich mich mit JTAble noch nicht so auskenne, steh ich vor folgendem Problem: Erstmal wie krieg ich das hin, dass ich eine leere JTable hab mit Überschriften, ohne in einem String-Array die Anzahl der Felder festzulegen. ich hab das zunächst so gelöst:
Java:
//die leeren Zeilen der Tabelle:
	private String[][] emptydata = new String[][]{	
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
		};
	//Die Ueberschrift der Spalten:
	private String[] ueberschrift = new String[]{"Artist", "Title", "Label", "Genre"};
	
	//Die Tabelle bezieht sich auf den String-Array mit leeren Zellen und die Ueberschriften
	private JTable bib = new JTable(emptydata,ueberschrift);
jetzt zum nächsten problem: wie krieg ich das hin, dass ich den Text, den ich in die JTextFields eingeb, in die JTable kommt. ich hab das zunächst mal mit setValueAt gelöst aber das ist glaub weniger elegant.Hier mal der komplette Code, ich hoffe jemand kann mir weiterhelfen:
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.table.JTableHeader;


public class VinylsFrame extends JFrame implements ActionListener{
	
	private static final long serialVersionUID = 1L;
	
	private JLabel artist = new JLabel("Artist:");
	private JLabel title = new JLabel("Title:");
	private JLabel label = new JLabel("Label:");
	private JLabel genre = new JLabel("Genre:");
	
	private JTextField artistTF = new JTextField(20);
	private JTextField titleTF = new JTextField(20);
	private JTextField labelTF = new JTextField(20);
	private JTextField genreTF = new JTextField(20);
	
	private JButton add = new JButton("add Vinyl");
	private JButton del = new JButton("delete Vinyl");
	
	
	//die leeren Zeilen der Tabelle:
	private String[][] emptydata = new String[][]{	
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
			{"","","",""},
		};
	//Die Ueberschrift der Spalten:
	private String[] ueberschrift = new String[]{"Artist", "Title", "Label", "Genre"};
	
	//Die Tabelle bezieht sich auf den String-Array mit leeren Zellen und die Ueberschriften
	private JTable bib = new JTable(emptydata,ueberschrift);
	
	//Konstruktor
	public VinylsFrame(){
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
	}
	
	private void init(){
		//Das Hauptpanel:
		JPanel mainpanel = new JPanel();
		mainpanel.setLayout(new BorderLayout());
		this.setSize(300,200);
		this.setTitle("myVinyls");
		add.addActionListener(this);
		
		//Die Labels und Eingabe-Textfields:
		JPanel input = new JPanel();
		input.setLayout(new GridLayout(2,4));
		input.add(artist);
		input.add(title);
		input.add(label);
		input.add(genre);
		input.add(artistTF);
		input.add(titleTF);
		input.add(labelTF);
		input.add(genreTF);
		
		//Die add- und delete-Buttons:
		JPanel buttons = new JPanel();
		buttons.setLayout(new GridLayout(1,2));
		buttons.add(add);
		buttons.add(del);
		
		//Die Tabelle:
		JPanel bibliothek = new JPanel();
		bibliothek.setLayout(new GridLayout(1,1));
		bibliothek.add(new JScrollPane(bib));
		
		
		
		//Ausrichtung der Panels:
		mainpanel.add(input, BorderLayout.NORTH);
		mainpanel.add(buttons, BorderLayout.CENTER);
		mainpanel.add(bibliothek, BorderLayout.SOUTH);

		this.setContentPane(mainpanel);
		this.pack();
		this.setVisible(true);
		
	}

	public void actionPerformed(ActionEvent evt){
		Object src = evt.getSource();
		
		if(src == add){
			bib.setValueAt(artistTF.getText(),0,0);
			bib.setValueAt(titleTF.getText(),0,1);
			bib.setValueAt(labelTF.getText(),0,2);
			bib.setValueAt(genreTF.getText(),0,3);
		}
	}
	
	
	protected void processWindowEvent(WindowEvent e) {
		super.processWindowEvent(e);
		if (e.getID() == WindowEvent.WINDOW_CLOSING) {
			System.exit(0);
		}
	}
}
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Der ideale Weg führt über ein Tabellenmodell. Ich würde wohl an deiner Stelle ein DefaultTableModel nehmen, dort hat es alle nötigen Methoden. Du kannst natürlich auch dein eigenes Modell implementieren und einige Methoden überschreiben um mit weniger Array hantieren zu müssen. Oder wenn deine Daten etwas komplexer werden.
So z.B. kannst du
Code:
getColumnCount()
immer 4 zurückliefern lassen, wenn deine Tabelle genau 4 Spalten haben soll. Analog dazu die Methode
Code:
getColumnName()
.

Letztlich aber sind die Methoden
Code:
addRow()
und
Code:
removeRow()
für dein Vorhaben interessant.

Java:
// Tabelle aufbauen
Object[][] data = new Object[0][4]; //leere Tabelle am Anfang
String[] header = new String[]{"Artist", "Title", "Label", "Genre"};
DefaultTableModel model = new DefaultTableModel(data, header);

JTable myTable = new JTable(model);

// Hinzufügen einer Zeile
Object[] row = new Object[4];
row[0] = myArtistTextField.getText();
row[1] = myTitleTextField.getText();
...

model.addRow(row);
//oder (jenachdem wie bekannt dein Modell ist)
((DefaultTableModel)myTable.getModel()).addRow(row);
 

Colt45

Aktives Mitglied
vielen dank, das funktioniert genauso wie ich mir das vorgestellt habe. jetzt fehlt nur noch die funktion des delete-buttons. gibt es da eine extra-Methode die die selektierte zeile löscht oder muss ich das anderweitig implementieren.
 

KrokoDiehl

Top Contributor
Ja, es gibt auch noch
Code:
removeRow(int)
und es gibt die JTable-Methoden
Code:
getSelectedRow()
und
Code:
getSelectedRows()
.

Aber Vorsicht, wenn man in deiner Tabelle sortieren kann, dann sind die Indizes von
Code:
getSelectedRow()
die View-Koordinaten und müssen nicht mit den Modell-Koordinaten übereinstimmen. Also erst umrechnen (für die API-faulen:
Code:
convertRowIndexToModel(int)
).

EDIT
Habe mich bei der convertRowIndexToModel() verschrieben (war vorher convertColumnIndexToModel(), was hier nicht relevant ist).
 
Zuletzt bearbeitet:

Colt45

Aktives Mitglied
irgendwie will das nich ganz klappen
ich weiß nich obs an meinem fieber liegt, dass ich den wahrscheinlich simplen fehler nich find, aber eclipse kreidet mir grundsätzlich die methode getSelectedRow() an mit der meldung "is undefined for the type DefaultTableModel". so und nachdem ich den letzten satz geschrieben hab, is mir aufgefallen wo der fehler sein könnte, habs dann so umgeändert, dass es nichmehr unterstrichen is, aber funktionieren tus nich
Java:
else if (src == del) {
		
		model.removeRow(bib.getSelectedRow());
		}
 

KrokoDiehl

Top Contributor
Was funktioniert nicht? Gibt es Fehler oder passiert einfach nichts? Entfernt er die falsche Zeile?
Code:
DefaultTableModel.removeRow(int)
entfernt die Zeile mit der angegebenen Nummer, bzw. wirft einen Fehler, wenn es diese Zeilennummer nicht gibt. Also wenn du es an einem Modell aufrufst, dass an eine Tabelle gebunden ist und wenn die Zeilennummer gültig ist und diese Funktion ausgeführt wird, sollte das tun.
 

Colt45

Aktives Mitglied
es passiert einfach nichts, es kommt keine fehlermeldung oder so, er löscht einfach keine zeile, weder eine markierte noch sonst eine...
und wenn ich es so formuliere "DefaultTableModel.removeRow(), dann kommt eine fehlermeldung dass er keine static reference to the non-static method removeRow() from the type DefaultTableModel herstellen kann.
habs auch schon so probiert, dass ich getSelectedRow() = int i; deklariert hab und dann removeRow(i); aber das funktioniert genauso wenig.
Hier nochmal der komplette Code, vllt findest du ja den Fehler:
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.xml.crypto.Data;

public class VinylsFrame extends JFrame implements ActionListener, Serializable {

	private static final long serialVersionUID = 1L;

	private JLabel artist = new JLabel("Artist:");
	private JLabel title = new JLabel("Title:");
	private JLabel label = new JLabel("Label:");
	private JLabel genre = new JLabel("Genre:");

	private JTextField artistTF = new JTextField(20);
	private JTextField titleTF = new JTextField(20);
	private JTextField labelTF = new JTextField(20);
	private JTextField genreTF = new JTextField(20);

	private JButton add = new JButton("add Vinyl");
	private JButton del = new JButton("delete Vinyl");

	private JMenuBar menu = new JMenuBar();
//	private Data dummydata;

	private Object[][] data = new Object[0][4];
	private String[] ueberschrift = new String[] { "Artist", "Title", "Label", "Genre" };
	private DefaultTableModel model = new DefaultTableModel(data, ueberschrift);
	private JTable bib = new JTable(model);

	

	// Konstruktor
	public VinylsFrame() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
	}

	private void init() {
		// Das Hauptpanel:
		JPanel mainpanel = new JPanel();
		mainpanel.setLayout(new BorderLayout());
		this.setSize(300, 200);
		this.setTitle("myVinyls");
		add.addActionListener(this);
		
		//Die MenuBar:
		this.setJMenuBar(menu);
		JMenu file = new JMenu("File");
		menu.add(file);
		file.add(new AbstractAction("Save") {
			public void actionPerformed(ActionEvent e) {
//				Data output = new Data("abc");
//				ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("c:/testfile.oos"));	
//				oos.writeObject(output);
				
				
	    	}
		});

		
		// Die Labels und Eingabe-Textfields:
		JPanel input = new JPanel();
		input.setLayout(new GridLayout(2, 4));
		input.add(artist);
		input.add(title);
		input.add(label);
		input.add(genre);
		input.add(artistTF);
		input.add(titleTF);
		input.add(labelTF);
		input.add(genreTF);

		// Die add- und delete-Buttons:
		JPanel buttons = new JPanel();
		buttons.setLayout(new GridLayout(1, 2));
		buttons.add(add);
		buttons.add(del);

		// Die Tabelle:
		JPanel bibliothek = new JPanel();
		bibliothek.setLayout(new GridLayout(1, 1));
		bibliothek.add(new JScrollPane(bib));

		// Ausrichtung der Panels:
		mainpanel.add(input, BorderLayout.NORTH);
		mainpanel.add(buttons, BorderLayout.CENTER);
		mainpanel.add(bibliothek, BorderLayout.SOUTH);

		this.setContentPane(mainpanel);
		this.pack();
		this.setVisible(true);

	}

	public void actionPerformed(ActionEvent evt) {
		Object src = evt.getSource();

		if (src == add) {
			Object[] column = new Object[4];
			{
				column[0] = artistTF.getText();	artistTF.setText("");
				column[1] = titleTF.getText();	titleTF.setText("");
				column[2] = labelTF.getText();	labelTF.setText("");
				column[3] = genreTF.getText();	genreTF.setText("");
				model.addRow(column);
			}

		}
		else if (src == del) {
		//int i = bib.getSelectedRow();
		model.removeRow(bib.getSelectedRow());
		}
	}

	
	protected void processWindowEvent(WindowEvent e) {
		super.processWindowEvent(e);
		if (e.getID() == WindowEvent.WINDOW_CLOSING) {
			System.exit(0);
		}
	}
}
 

KrokoDiehl

Top Contributor
:D
Der Button
Code:
del
bekommt nicht den ActionListener zugewiesen. Zeile 51 in deinem geposteten Code, derart musst du es noch mit
Code:
del
machen.

Dann würde ich noch eine Sicherheitsabfrage einbauen, falls nichts selektiert ist, sonst gibts hässliche Ausnahmen
Java:
else if (src == del) {
    int row = bib.getSelectedRow();
    if (row < 0)
        return;
    model.removeRow(row);
}
 

Colt45

Aktives Mitglied
lol, ja kein wunder, da hätt ich auch selber drauf kommen können! aber vielen dank, manchmal sieht man den wald vor lauter bäumen nich
damit stehen die grundfunktionen, jetzt steh ich noch vor einer großen hürde, nämlich wie ich das abspeichern kann, was ich da reinschreib, das is noch komplettes neuland für mich...
 

KrokoDiehl

Top Contributor
Tja dafür solltest du erstmal ein Speicherformat aussuchen. Datenbank, Datei, XML, ...

Die erstmal schnellste Variante ist eine einfache Textdatei in der du Zeilenweise
die Tabellenfelder reinschreibst, á la
Code:
Zelle00;Zelle01;Zelle02;Zelle03
Zelle10;Zelle11;Zelle12;Zelle13
Zelle20;Zelle21;Zelle22;Zelle23
..oder einer beliebigen anderen Formatierung.

Zum Thema Dateien schreiben/lesen gibts im Internet genug Hilfen.
 

Colt45

Aktives Mitglied
Jo, ich versuch mich auch erstmal selber reinzufinden, und das alleine zu lösen
ich werde wahrscheinlich dei methode einer txt-datei wählen, da vorerst nich mehr als 300 Zeilen da reinkommen.
aber vielen dank für deine hilfe und alles
 

Colt45

Aktives Mitglied
hab jetzt was gefunden, wie man das ganze in ne xml-datei speichern kann, er erstellt mir auch eine xml-datei, allerdings eine leere. dann hab ich noch gelesen, dass das nur mit Beans funktioniert, also dass das tablemodel ein bean sein muss. hab aber keinerlei ahnung was ein bean is
hier mal soweit ich gekommen bin
Java:
this.setJMenuBar(menu);
		JMenu file = new JMenu("File");
		menu.add(file);
		file.add(new AbstractAction("Save") {
			public void actionPerformed(ActionEvent e) {
				
				try 
                {
                    XMLEncoder encode = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("myVinyls.xml")));
                    encode.writeObject(model);
                    encode.close();
                } 
                catch(IOException exx) 
                {
                    exx.printStackTrace();
                }

				
			}
		});
 

André Uhres

Top Contributor
hab aber keinerlei ahnung was ein bean is
Für XMLEncoder muss die zu speichernde Klasse eine recht einfache Struktur respektieren:
sie muss eine "public class" sein mit einem "default" Konstruktor (also ohne Parameter) und Gettern+Settern für die Attribute. Wir sollten auch wissen, daß die Ausgabe möglichst optimiert wird. Z.B. werden Werte nicht gespeichert, wenn sie mit der Instanzierung der Klasse schon als default Werte vorhanden sind.
Java:
/*
 * MyTableModel.java
 * is a bean that can be saved/loaded using XMLEncoder/XMLDecoder
 */
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
public class MyTableModel extends DefaultTableModel{
    public MyTableModel(){
        super(0, 4);
    }
    public void setDataVector(Vector vector){
        dataVector = vector;
    }
    public Vector getColumnIdentifiers(){
        return columnIdentifiers;
    }
}
http://www.java-forum.org/attachmen...le-werte-speichern-laden-tablesavecolumns.jar
 

Colt45

Aktives Mitglied
ich checks immer noch nich, hab den standard-konstruktor und die getter und setter drin, aber das einzige was er in die xml-datei reinspeichert is die anzahl spalten und zeilen, die ich in der JTable füll
Java:
public VinylsFrame() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
	}
	
	public DefaultTableModel getModel() {
		return model;
	}

	public void setModel(DefaultTableModel model) {
		this.model = model;
	}

this.setJMenuBar(menu);
		JMenu file = new JMenu("file");
		menu.add(file);

// Abspeichern der Table (funktioniert noch nicht):
		file.add(new AbstractAction("save") {
			public void actionPerformed(ActionEvent e) {
				
				try 
                {
                    XMLEncoder encode = new XMLEncoder(new FileOutputStream("myVinyls.xml"));
                    encode.writeObject(model);
                    encode.close();
                } 
                catch(IOException ex) 
                {
                    ex.printStackTrace();
                }

				
			}
		});
		file.addSeparator();
		// Laden der Table (funktioniert noch nicht):
		file.add(new AbstractAction("load"){
			public void actionPerformed(ActionEvent e) {
				
				try
				{
					XMLDecoder decode = new XMLDecoder(new FileInputStream("myVinyls.xml"));
					decode.readObject();
					decode.close();
				}
				catch(IOException ex) 
                {
                    ex.printStackTrace();
                }
			}
		});
 

André Uhres

Top Contributor
In deinem Codefragment ist kein Fehler erkennbar. Funktioniert super bei mir.
Ausser daß du bei "readObject" den Rückgabewert nicht zuordnest, aber das ist ja beim "save" erstmal egal.
 
Zuletzt bearbeitet:

Colt45

Aktives Mitglied
na toll...kann das an eclipse liegen??
hier mal der koplette code
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class VinylsFrame extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;

	private JLabel artist = new JLabel("Artist:");
	private JLabel title = new JLabel("Title:");
	private JLabel label = new JLabel("Label:");
	private JLabel genre = new JLabel("Genre:");

	private JTextField artistTF = new JTextField(20);
	private JTextField titleTF = new JTextField(20);
	private JTextField labelTF = new JTextField(20);
	private JTextField genreTF = new JTextField(20);

	private JButton add = new JButton("add Vinyl");
	private JButton del = new JButton("delete Vinyl");

	private JMenuBar menu = new JMenuBar();

	private Object[][] data = new Object[0][4];
	private String[] ueberschrift = new String[] { "Artist", "Title", "Label","Genre" };
	private DefaultTableModel model = new DefaultTableModel(data, ueberschrift);
	private JTable bib = new JTable(model);

	// Konstruktor
	public VinylsFrame() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
	}
	
	public DefaultTableModel getModel() {
		return model;
	}

	public void setModel(DefaultTableModel model) {
		this.model = model;
	}
	
	private void init() {
		// Das Hauptpanel:
		JPanel mainpanel = new JPanel();
		mainpanel.setLayout(new BorderLayout());
		this.setSize(300, 200);
		this.setTitle("myVinyls");
		add.addActionListener(this);
		del.addActionListener(this);

		// Die MenuBar:
		this.setJMenuBar(menu);
		JMenu file = new JMenu("file");
		menu.add(file);
				
		// Abspeichern der Table (funktioniert noch nicht):
		file.add(new AbstractAction("save") {
			public void actionPerformed(ActionEvent e) {
				
				try 
                {
                    XMLEncoder encode = new XMLEncoder(new FileOutputStream("myVinyls.xml"));
                    encode.writeObject(model);
                    encode.close();
                } 
                catch(IOException ex) 
                {
                    ex.printStackTrace();
                }

				
			}
		});
		file.addSeparator();
		// Laden der Table (funktioniert noch nicht):
		file.add(new AbstractAction("load"){
			public void actionPerformed(ActionEvent e) {
				
				try
				{
					XMLDecoder decode = new XMLDecoder(new FileInputStream("myVinyls.xml"));
					decode.readObject();
					decode.close();
				}
				catch(IOException ex) 
                {
                    ex.printStackTrace();
                }
			}
		});
		file.addSeparator();
		
		// Die Labels und Eingabe-Textfields:
		JPanel input = new JPanel();
		input.setLayout(new GridLayout(2, 4));
		input.add(artist);
		input.add(title);
		input.add(label);
		input.add(genre);
		input.add(artistTF);
		input.add(titleTF);
		input.add(labelTF);
		input.add(genreTF);

		// Die add- und delete-Buttons:
		JPanel buttons = new JPanel();
		buttons.setLayout(new GridLayout(1, 2));
		buttons.add(add);
		buttons.add(del);

		// Die Tabelle:
		JPanel bibliothek = new JPanel();
		bibliothek.setLayout(new GridLayout(1, 1));
		bibliothek.add(new JScrollPane(bib));

		// Ausrichtung der Panels:
		mainpanel.add(input, BorderLayout.NORTH);
		mainpanel.add(buttons, BorderLayout.CENTER);
		mainpanel.add(bibliothek, BorderLayout.SOUTH);

		this.setContentPane(mainpanel);
		this.pack();
		this.setVisible(true);

	}

	

	public void actionPerformed(ActionEvent evt) {
		Object src = evt.getSource();

		if (src == add) {
			Object[] column = new Object[4];
			{
				column[0] = artistTF.getText();artistTF.setText("");
				
				column[1] = titleTF.getText();titleTF.setText("");
				
				column[2] = labelTF.getText();labelTF.setText("");
				
				column[3] = genreTF.getText();genreTF.setText("");
				
				model.addRow(column);
			}

		} else if (src == del) {
			int row = bib.getSelectedRow();
			if (row < 0)
				return;
			model.removeRow(row);

		}
	}

	protected void processWindowEvent(WindowEvent e) {
		super.processWindowEvent(e);
		if (e.getID() == WindowEvent.WINDOW_CLOSING) {
			System.exit(0);
		}
	}
}
und hier noch die zweite klasse
Java:
import javax.swing.UIManager;


public class VinylsApplication {
	
	public VinylsApplication(){
		VinylsFrame frame = new VinylsFrame();
		frame.validate();
		frame.setVisible(true);
		

	}
	public static void main(String[] args) {
		try{UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());}
		catch(Exception e)
		{}
		new VinylsApplication();		
	}
}
und so sieht dann die xml-datei aus, wenn ich in der JTable 4 zeilen mit text beleg und dann abspeichere.
[XML]<?xml version="1.0" encoding="UTF-8" ?>
- <java version="1.6.0_16" class="java.beans.XMLDecoder">
- <object class="javax.swing.table.DefaultTableModel">
- <void property="columnCount">
<int>4</int>
</void>
- <void property="rowCount">
<int>4</int>
</void>
</object>
</java>[/XML]
 

André Uhres

Top Contributor
na toll...kann das an eclipse liegen?
Nein, wie schon oben am Beispiel "MyTableModel" gezeigt, brauchst du erstmal für das zu speichernde Objekt (also dein TableModel) eine "public class" mit "default"-Konstruktor und "Getter/Setter" für die Attribute:
Java:
/*
 * VinylsModel.java
 * is a bean that can be saved/loaded using XMLEncoder/XMLDecoder
 */
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
//1. "public class" ist wichtig!! 
public class VinylsModel extends DefaultTableModel {//<----------------------------------------
//2.  "default" Konstruktor ist wichtig!! 
    public VinylsModel() {//<----------------------------------------
        super();
    }
    public VinylsModel(Object[][] data, String[] ueberschrift) {
        super(data, ueberschrift);
    }
//3. "Getter/Setter" für die Attribute sind wichtig!! 
    public void setDataVector(Vector vector) {//<----------------------------------------
        dataVector = vector;
    }
    public Vector getColumnIdentifiers() {//<----------------------------------------
        return columnIdentifiers;
    }
}
Dieses Model kannst du dann für deine JTable benutzen, speichern und laden:
Java:
...
public class VinylsFrame extends JFrame implements ActionListener {
...
    private DefaultTableModel model = new VinylsModel(data, ueberschrift);
...
        // Laden der Table:
        file.add(new AbstractAction("load") {
            public void actionPerformed(ActionEvent e) {
                try {
                    XMLDecoder decode = new XMLDecoder(new FileInputStream("myVinyls.xml"));
                    model = (DefaultTableModel) decode.readObject();
                    bib.setModel(model);
                    decode.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
...
 

Colt45

Aktives Mitglied
Aaaah, jetzt versteh ich
läuft auch jetzt super...
Vielen Dank nochmal an euch zwei, wart mir eine sehr große Hilfe
 

Colt45

Aktives Mitglied
tag auch, hab jetzt noch n kleines problem mit meinem programm.
hab zusätzlich noch einen rowsorter eingefügt, dass ich das ganze dann auch alphabetisch sortieren kann, ich kann das dann auch abspeichern, allerdings nichtmehr laden...
Java:
public class PointRender extends DefaultTableCellRenderer {
	
    public Component getTableCellRendererComponent( JTable table, Object value, 
            boolean isSelected, boolean hasFocus, int row, int column ) {
        Point point = (Point)value;
        String text = point.x + " / " + point.y;
        return super.getTableCellRendererComponent( table, text, isSelected,
            hasFocus,  row, column );
    }


}

Java:
/ Shortcut load table:
		JMenuItem load = new JMenuItem(new AbstractAction("Load table") {

			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {

				try {
					XMLDecoder decode = new XMLDecoder(new FileInputStream(
							"myVinyls.xml"));
					model = (DefaultTableModel) decode.readObject();
					bib.setModel(model);
					decode.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		});
	load.setMnemonic('L');
		load.setAccelerator(KeyStroke.getKeyStroke(
				java.awt.event.KeyEvent.VK_L, java.awt.Event.CTRL_MASK));
		file.add(load);
 

Colt45

Aktives Mitglied
Das dachte ich auch, weil eigentlich dürfte das nich gegenseitig konkurrieren, aber seit ich den rowsorter implementiert hab, gehts nichmehr
vllt. hilft das codefragment weiter:
Java:
private JMenuBar menu = new JMenuBar();

	private Object[][] data = new Object[0][4];
	private String[] ueberschrift = new String[] { "Artist", "Title",
			"Labelcode", "Genre" };
	private DefaultTableModel model = new VinylsModel(data, ueberschrift);
	private JTable bib = new JTable(model);
	private TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>();


// Konstruktor
	public VinylsFrame() {
		enableEvents(AWTEvent.WINDOW_EVENT_MASK);
		init();
	}

// init-Methode
	private void init() {
		bib.setDefaultRenderer( Point.class, new PointRender());

		bib.setRowSorter(sorter);
		sorter.setModel(model);
// Die MenuBar:
		this.setJMenuBar(menu);
		
		JMenu file = new JMenu("File");
		file.setMnemonic('F');
		menu.add(file);
		
// Shortcut save table:
		JMenuItem save = new JMenuItem(new AbstractAction("Save table") {
		
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {

				try {
					XMLEncoder encode = new XMLEncoder(new FileOutputStream(
							"myVinyls.xml"));
					encode.writeObject(model);
					encode.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		});
		save.setMnemonic('S');
		save.setAccelerator(KeyStroke.getKeyStroke(
				java.awt.event.KeyEvent.VK_S, java.awt.Event.CTRL_MASK));
		file.add(save);

// Shortcut load table(FUNKTIONIERT NICHT MEHR!!!!):
		JMenuItem load = new JMenuItem(new AbstractAction("Load table") {

			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {

				try {
					XMLDecoder decode = new XMLDecoder(new FileInputStream(
							"myVinyls.xml"));
					model = (DefaultTableModel) decode.readObject();
					bib.setModel(model);
					decode.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		});
	load.setMnemonic('L');
		load.setAccelerator(KeyStroke.getKeyStroke(
				java.awt.event.KeyEvent.VK_L, java.awt.Event.CTRL_MASK));
		file.add(load);
 

Colt45

Aktives Mitglied
so, ich hab schon wieder ein problem:
ich bin soweit mit allen funktionen fertig, jetzt fehlen noch ein paar design-details
Ich hab zum Speichern/Laden der Table einen JFileChooser importiert, der funktioniert auch so wie ich will, allerdings muss ich beim speichern jedesmal die dateiendung dazuschreiben, also myvinyls.xml.
Ich will aber nur myvinyls eingeben können, sodass er mir die endung automatisch hinzufügt.
hab dann einen FileFilter eingebaut, der auch unten bei "Dateityp" xml-Datei anzeigt, aber die endung wird trotzdem nicht generiert.
hier mal der code dazu:
Java:
JMenuItem save = new JMenuItem(new AbstractAction("Save table") {

			public void actionPerformed(ActionEvent e) {

				JFileChooser jfc = new JFileChooser("C:/Users/Jonas/Desktop/myVinyls");
				jfc.setFileFilter(new FileFilter() {
					public boolean accept(File f) {
					return	f.getName().toLowerCase().endsWith(".xml") || f.isDirectory();
					}
					public String getDescription() {
						return "xml-Datei(*.xml)";
					}
				});

				int result = jfc.showSaveDialog(jfc);
				if (result == JFileChooser.CANCEL_OPTION){
					return;
				}
				File file = jfc.getSelectedFile();
				try {
					XMLEncoder encode = new XMLEncoder(new FileOutputStream(
							file));
					encode.writeObject(model);
					encode.close();
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		});
		save.setMnemonic('S');
		save.setAccelerator(KeyStroke.getKeyStroke(
				java.awt.event.KeyEvent.VK_S, java.awt.Event.CTRL_MASK));
		file.add(save);
achja, wenn ich keine dateiendung mit dazuschreibe, dann speichert er das als (keine ahnung wie ich das nennen soll) blank-datei, also ohne endung, die ich aber komischerweise laden kann, und wenn ich diese datei mit einem browser öffne, dann ist sie auch im xml-stil.
 

KrokoDiehl

Top Contributor
Aber mal zur Sicherheit gefragt:
Du hast im Explorer eingestellt, dass er bekannte Dateitypen ausblenden soll? Vielleicht siehst du die Endung nur nicht, aber da ist sie :)
 

Colt45

Aktives Mitglied
nein, ich sehe alle dateiendungen, das ist nämlich meiner meinung nach die unsinnigste einstellung bei windows, also daran liegts nicht
 

KrokoDiehl

Top Contributor
Hm, probier mal die Klasse FileNameExtensionFilter:

Java:
FileNameExtensionFilter filter = new FileNameExtensionFilter("XML-Dateien", "xml");
myFileChooser.setFileFilter(filter);

Vielleicht fügt der die entsprechende Endung an.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
Y JTable AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben