Hi,
nachdem ich an der Uni ein Semester lang java-kurs hatte, hab ich mir ein buch gekauft und dieses durchgearbeitet. nun wollte ich mal was eigenes machen und hab gehört ein adressbuch ist eine beliebte anfänger-übung (deshalb auch in dieses Forum gepostet)...gesagt getan.
an hand des JTable Tutorials in den FAQ (ja die hab ich gelesen :wink: ) hab ich auch versucht ein tableModel zu erstellen.
Bevor ich lang rumlaber post ich jetzt einfach mal den code: (ich hoff jemand findet sich bei soviel durcheinander zurecht, da ich wie gesagt noch wenig ahnung von der strukturierung hab)
*Mein größtes Problem ist, dass die Eingabe, die ich gemacht und dem model als neues Eintragsobjekt übergeben habe, nicht in der Tabelle angezeigt wird und ich nicht weiß warum, da es ja im tut auch funktioniert)
*Eine weitere Frage ist, ob meine Klassenaufteilung (+Vererbung etc) sinnvoll ist bzw wie mans besser machen könnte
*Wie speicher ich die geschichte, wenn sie richtig läuft sinnvoll
Klasse Eintrag bündelt einen Adressbuch-Eintrag:
GUI-Gesamt (die oberklasse über der GUI für den Eintrag und der für die Tabellendarstellung)
Die Klasse für das Anlegen eines neuen Eintrags + Gui
Das eigentlich Hauptfenster + Tabelle
TableModel (bei dem ich gar nicht wusste, wie ich die Klasse irgendwie mit anderen verbinden soll ?!)
Hier ist auch der einzige codeschnipsel den ich copy/pasted habe, jedoch nicht ganz verstehe, was da genau passiert, nämlich beim verschicken des events/for-schleife.
Zu guter letzt die Anwendungsklasse:
Ich weiß dass es bestimmt irrsinnig unübersichtlich ist, aber ich wäre sehr sehr dankbar, wenn jemand mal n auge drauf werfen könnte, weil ich allein leider nicht mehr weiter weiss :bahnhof:.
Wie gesagt, die sache kompiliert sich einwandfrei, nur anzeigen will die tabelle nix.
THX im Voraus
nachdem ich an der Uni ein Semester lang java-kurs hatte, hab ich mir ein buch gekauft und dieses durchgearbeitet. nun wollte ich mal was eigenes machen und hab gehört ein adressbuch ist eine beliebte anfänger-übung (deshalb auch in dieses Forum gepostet)...gesagt getan.
an hand des JTable Tutorials in den FAQ (ja die hab ich gelesen :wink: ) hab ich auch versucht ein tableModel zu erstellen.
Bevor ich lang rumlaber post ich jetzt einfach mal den code: (ich hoff jemand findet sich bei soviel durcheinander zurecht, da ich wie gesagt noch wenig ahnung von der strukturierung hab)
*Mein größtes Problem ist, dass die Eingabe, die ich gemacht und dem model als neues Eintragsobjekt übergeben habe, nicht in der Tabelle angezeigt wird und ich nicht weiß warum, da es ja im tut auch funktioniert)
*Eine weitere Frage ist, ob meine Klassenaufteilung (+Vererbung etc) sinnvoll ist bzw wie mans besser machen könnte
*Wie speicher ich die geschichte, wenn sie richtig läuft sinnvoll
Klasse Eintrag bündelt einen Adressbuch-Eintrag:
Code:
// bündelt alle Attribute eines Eintrages und stellt getter/setter zum
// zugriff zur verfügung
// Im moment sind der einfachheit halber noch alle atrribute Strings!
package adressbuch2;
public class Eintrag {
private String name;
private String vorname;
private String adresse;
private String geburtsdatum;
private String telefonnummer;
private String email;
public void setName(String neuerName)
{
name = neuerName;
}
public void setVorname(String neuerVorname)
{
vorname = neuerVorname;
}
public void setAdresse(String neueAdresse)
{
adresse = neueAdresse;
}
public void setGeburtsdatum(String neuesDatum)
{
geburtsdatum = neuesDatum;
}
public void setTelefonnummer(String neueNummer)
{
telefonnummer = neueNummer;
}
public void setEmail(String neueEmail)
{
email = neueEmail;
}
public String getName()
{
return name;
}
public String getVorname()
{
return vorname;
}
public String getAdresse()
{
return adresse;
}
public String getGeburtsdatum()
{
return geburtsdatum;
}
public String getTelefonnummer()
{
return telefonnummer;
}
public String getEmail()
{
return email;
}
}
GUI-Gesamt (die oberklasse über der GUI für den Eintrag und der für die Tabellendarstellung)
Code:
package adressbuch2;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.*;
public class GuiGesamt extends JFrame{
// TableModel
final Model meinmodel = new Model();
// Hilfsmethode zum leichteren handling des gridbaglayouts
protected GridBagConstraints makegbc(int x, int y, int width, int height)
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.insets = new Insets(1, 1, 1, 1);
return gbc;
}
}
Die Klasse für das Anlegen eines neuen Eintrags + Gui
Code:
package adressbuch2;
//erzeugt das Fenster in dem ein neuer Eintrag angelegt werden kann
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class EintragGui extends GuiGesamt implements ActionListener {
//Erzeugung der einzelnen Textfelder und Buttons
JTextField nameField = new JTextField(15);
JTextField vornameField = new JTextField(15);
JTextField adressField = new JTextField(15);
JTextField geburtsdatumField = new JTextField(15);
JTextField telefonnummerField = new JTextField(15);
JTextField emailField = new JTextField(15);
JButton cancelButton = new JButton("cancel");
JButton addEntry = new JButton("Hinzufügen");
//Konstruktor für die grafische Oberfläche
public EintragGui()
{
setTitle("Neuen Eintrag anlegen");
//verwendung eines gridbaglayouts zur positionierung der Elemente
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc;
setLayout(gbl);
gbc = makegbc(0, 0, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(nameField, gbc);
add(nameField);
gbc = makegbc(0, 1, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(vornameField, gbc);
add(vornameField);
gbc = makegbc(0, 2, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(adressField, gbc);
add(adressField);
gbc = makegbc(0, 3, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(geburtsdatumField, gbc);
add(geburtsdatumField);
gbc = makegbc(0, 4, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(telefonnummerField, gbc);
add(telefonnummerField);
gbc = makegbc(0, 5, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbl.setConstraints(emailField, gbc);
add(emailField);
gbc = makegbc(1, 0, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel nameText = new JLabel("Name");
gbl.setConstraints(nameText, gbc);
add(nameText);
gbc = makegbc(1, 1, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel vornameText = new JLabel("Vorname");
gbl.setConstraints(vornameText, gbc);
add(vornameText);
gbc = makegbc(1, 2, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel adressText = new JLabel("Adresse");
gbl.setConstraints(adressText, gbc);
add(adressText);
gbc = makegbc(1, 3, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel geburtsdatumText = new JLabel("Geburtsdatum");
gbl.setConstraints(geburtsdatumText, gbc);
add(geburtsdatumText);
gbc = makegbc(1, 4, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel telefonnummerText = new JLabel("Telefonnummer");
gbl.setConstraints(telefonnummerText, gbc);
add(telefonnummerText);
gbc = makegbc(1, 5, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
JLabel emailText = new JLabel("Email");
gbl.setConstraints(emailText, gbc);
add(emailText);
gbc = makegbc(0, 6, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.EAST;
gbl.setConstraints(addEntry, gbc);
add(addEntry);
gbc = makegbc(1, 6, 1, 1);
gbc.fill = GridBagConstraints.BOTH;
gbc.anchor = GridBagConstraints.WEST;
gbl.setConstraints(cancelButton, gbc);
add(cancelButton);
addEntry.addActionListener(this);
cancelButton.addActionListener(this);
WindowListener listener = new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
//versteckt nur das Fenster und gibt den Speicherplatz frei,
//schließt jedoch nicht die ganze Anwendung
setVisible(false);
dispose();
}
};
addWindowListener(listener);
}
public void actionPerformed(ActionEvent ae)
{
Object eventQuelle = ae.getSource();
if(eventQuelle == addEntry)
{
// einen neue Instanz vom Typ Eintrag anlegen
Eintrag neuerEintrag = createEintrag();
// den Eintrag dem model hinzufügen
meinmodel.addEintrag( neuerEintrag );
// !! test: in zelle 0,0 steht neu.getName() !!
// System.out.println(model.getValueAt(0,0));
setVisible(false);
dispose();
}
if(eventQuelle == cancelButton)
{
setVisible(false);
dispose();
}
}
public Eintrag createEintrag()
{
Eintrag neu = new Eintrag();
neu.setName(nameField.getText());
neu.setVorname(vornameField.getText());
neu.setAdresse(adressField.getText());
neu.setGeburtsdatum(geburtsdatumField.getText());
neu.setTelefonnummer(telefonnummerField.getText());
neu.setEmail(emailField.getText());
return neu;
}
}
Das eigentlich Hauptfenster + Tabelle
Code:
package adressbuch2;
//Beinhaltet das eigentliche Hauptfenster
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MainGui extends GuiGesamt implements ActionListener{
public MainGui()
{
setTitle("Adressbuch");
//Menüleiste
JMenuBar menubar = new JMenuBar();
menubar.add(createFileMenu());
setJMenuBar(menubar);
tabelleAnlegen();
}
public void tabelleAnlegen()
{
// Das JTable initialisieren
JTable adresstabelle = new JTable( meinmodel );
Container content = getContentPane();
content.add( new JScrollPane( adresstabelle ), BorderLayout.CENTER );
}
public void actionPerformed(ActionEvent event)
{
if (event.getActionCommand() == "Neuen Eintrag anlegen")
{
JFrame eintragRahmen = new EintragGui();
eintragRahmen.setSize(400, 200);
eintragRahmen.setLocationRelativeTo(null);
eintragRahmen.setVisible(true);
eintragRahmen.setResizable(false);
eintragRahmen.setAlwaysOnTop(true);
}
if (event.getActionCommand() == "Beenden")
{
System.exit(0);
}
}
private JMenu createFileMenu()
{
JMenu datei = new JMenu("Datei");
datei.setMnemonic('D');
JMenuItem newEntry;
JMenuItem save;
JMenuItem quit;
//Neuer Eintrag
newEntry = new JMenuItem("Neuen Eintrag anlegen");
newEntry.addActionListener(this);
newEntry.setMnemonic('N');
datei.add(newEntry);
//Speichern
//Noch nicht implementiert, soll aber später mal das array mit seinen
//beinhalteten objekten speichern
save = new JMenuItem("Speichern");
save.addActionListener(this);
save.setMnemonic('S');
datei.add(save);
//Separator
datei.addSeparator();
//Beenden
quit = new JMenuItem("Beenden");
quit.addActionListener(this);
quit.setMnemonic('B');
//hat keinen Konstruktor! Erzeugung nur mit "Factory Methode" getKeyStroke
KeyStroke shortcut = KeyStroke.getKeyStroke('B',InputEvent.CTRL_MASK);
quit.setAccelerator(shortcut);
datei.add(quit);
return datei;
}
}
TableModel (bei dem ich gar nicht wusste, wie ich die Klasse irgendwie mit anderen verbinden soll ?!)
Hier ist auch der einzige codeschnipsel den ich copy/pasted habe, jedoch nicht ganz verstehe, was da genau passiert, nämlich beim verschicken des events/for-schleife.
Code:
package adressbuch2;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.swing.event.TableModelEvent;
import java.util.Vector;
public class Model implements TableModel {
private Vector eintraege = new Vector();
private Vector listeners = new Vector();
public void addEintrag( Eintrag einEintrag )
{
// Das wird der Index des Eintrags
int index = eintraege.size();
eintraege.add(einEintrag);
// Jetzt werden alle Listeners benachrichtigt
// Zuerst ein Event, "neue Row an der Stelle index" herstellen
TableModelEvent e = new TableModelEvent( this, index, index, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT );
// Nun das Event verschicken
for( int i = 0, n = listeners.size(); i<n; i++ )
{
((TableModelListener)listeners.get( i )).tableChanged( e );
}
//!!test System.out.println(this.getValueAt(0,0));
}
// Anzahl der Einträge
public int getRowCount()
{
return eintraege.size();
}
// Anzahl der Attribute von Eintrag (Name, Adresse etc)
public int getColumnCount()
{
return 6;
}
// Die Titel der einzelnen Columns
public String getColumnName(int column)
{
switch( column )
{
case 0: return "Name";
case 1: return "Vorname";
case 2: return "Adresse";
case 3: return "Geburtsdatum";
case 4: return "Telefonnummer";
case 5: return "email";
default: return null;
}
}
// Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
public Class getColumnClass(int columnIndex)
{
switch( columnIndex )
{
case 0: return String.class;
case 1: return String.class;
case 2: return String.class;
case 3: return String.class;
case 4: return String.class;
case 5: return String.class;
default: return null;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return true;
}
// Der Wert der Zelle (rowIndex, columnIndex)
public Object getValueAt(int rowIndex, int columnIndex)
{
Eintrag eintrag = (Eintrag)eintraege.get( rowIndex );
switch( columnIndex )
{
case 0: return eintrag.getName();
case 1: return new String( eintrag.getVorname() );
case 2: return new String( eintrag.getAdresse() );
case 3: return new String( eintrag.getGeburtsdatum() );
case 4: return new String( eintrag.getTelefonnummer() );
case 5: return new String( eintrag.getEmail() );
default: return null;
}
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
// vorerst keine Implementierung
}
public void addTableModelListener(TableModelListener l) {
listeners.add( l );
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove( l );
}
}
Zu guter letzt die Anwendungsklasse:
Code:
//Erstellt das Hauptfenster und ermöglicht sein schließen
package adressbuch2;
import javax.swing.*;
public class Anwendung {
public static void main(String[] args) {
JFrame mainRahmen = new MainGui();
mainRahmen.setSize(611, 500);
mainRahmen.setLocationRelativeTo(null);
mainRahmen.setVisible(true);
mainRahmen.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}
Ich weiß dass es bestimmt irrsinnig unübersichtlich ist, aber ich wäre sehr sehr dankbar, wenn jemand mal n auge drauf werfen könnte, weil ich allein leider nicht mehr weiter weiss :bahnhof:.
Wie gesagt, die sache kompiliert sich einwandfrei, nur anzeigen will die tabelle nix.
THX im Voraus