Hallo Java Forum,
ich hab ein kleines feines ResultSet Tabellenmodell, aber ich kann dies nicht aktualisieren.
Also hab ich nach schon seit einiger Zeit im Internet nach einem kompakten rundum TabellenModell das mit ResultSets arbeitet, gesucht aber nichts hilfreiches gefunden.
Ich stehe nach wie vor, vor dem Problem, wie ich dieses ResultSet Tabellenmodell aktualisieren kann. Ich möchte neue Daten direkt in der Datenbank hinzufügen (über SQL Statement), aber auch löschen können (ebenfalls über SQL) und das Tabellenmodell soll diese Veränderungen in meiner Swing Oberfläche darstellen.
Da finden sich aber so einige Fragezeichen.
Zum Programm:
hier ein Auszug vom MitarbeiterPanel, die grafische Oberfläche in der das stattfinden soll.
Mein "Tabellenmodell", es arbeitet nur mit ResultSet
DBConnect
Die einfachste Überlegung die ich angestellt habe, die Query SELECT * FROM ... einfach neu abschicken und die Tabelle neu setzen (Funktion performTabelle()). Was aber nicht so funktioniert wie ich es gedacht hatte.
.revalidate() richtet es leider auch nicht.
So komm ich wohl bei dem Tabellenmodell nicht drumrum dort anzusetzen aber wie stelle ich dies bei meiner Vorlage (DBUtils) am Besten an? Auch so das nicht nur neue Datensätze angezeigt werden, sondern auch Veränderungen (UPDATE und DELETE) gleich übernommen werden?
Über jede Hilfe wäre ich sehr dankbar.
ich hab ein kleines feines ResultSet Tabellenmodell, aber ich kann dies nicht aktualisieren.
Also hab ich nach schon seit einiger Zeit im Internet nach einem kompakten rundum TabellenModell das mit ResultSets arbeitet, gesucht aber nichts hilfreiches gefunden.
Ich stehe nach wie vor, vor dem Problem, wie ich dieses ResultSet Tabellenmodell aktualisieren kann. Ich möchte neue Daten direkt in der Datenbank hinzufügen (über SQL Statement), aber auch löschen können (ebenfalls über SQL) und das Tabellenmodell soll diese Veränderungen in meiner Swing Oberfläche darstellen.
Da finden sich aber so einige Fragezeichen.
Zum Programm:
hier ein Auszug vom MitarbeiterPanel, die grafische Oberfläche in der das stattfinden soll.
Java:
public class MitarbeiterPanel
extends JPanel
implements ActionListener
{
//Eingabe-Attribute
private JLabel lblInfo;
private JFormattedTextField ftfBearbMitarbNr, ftfErstMitarbNr;
private JTextField txtBearbName, txtErstName;
private JTextField txtBearbVorname, txtErstVorname;
private JTextField txtBearbStrasse, txtErstStrasse;
private JTextField txtBearbOrt, txtErstOrt;
private JFormattedTextField ftfBearbPLZ, ftfErstPLZ;
private JFormattedTextField ftfBearbTel, ftfErstTel;
private JTextField txtBearbEmail, txtErstEmail;
//Suchen Attribute
private JFormattedTextField ftfSuchMitarbNr;
private JTextField txtSuchName;
private JTextField txtSuchVorname;
private JTable tblAnzeige;
private JScrollPane scrolltabelle;
//Buttons
private JButton btnErstellen;
private JButton btnBearbeiten;
private JButton btnLoeschen;
private JButton btnZurueck, btnWeiter;
//Tabellen Attribute
private Vector spaltenNamen = new Vector();
private Vector daten = new Vector();
//Klassen
private DBConnect dbc = new DBConnect();
//Zaehlvariable
...
public MitarbeiterPanel()
{
//Layout festlegen für alle Panels, einschließlich
//Hauptpanel
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints gdc = new GridBagConstraints();
gdc.fill = GridBagConstraints.BOTH;
gdc.insets = new Insets(5,5,5,5);
//Layout für das Bearbeiten
..........
// === Layout für das Erstellen eines Mitarbeiters ===
JPanel erstellen = new JPanel();
erstellen.setLayout(gridbag);
erstellen.setBorder(new TitledBorder("Dienstleister Erstellen"));
lblInfo = new JLabel("Mitarbeiter Nr.");
gdc.gridx = 0;
gdc.gridy = 0;
erstellen.add(lblInfo, gdc);
ftfErstMitarbNr = new JFormattedTextField("#####");
ftfErstMitarbNr.setEditable(false);
ftfErstMitarbNr.setToolTipText("Automatisch ausfüllende Mitarbeiter-Nummer");
gdc.gridx = 1;
gdc.gridy = 0;
erstellen.add(ftfErstMitarbNr, gdc);
lblInfo = new JLabel("Nachname");
gdc.gridx = 0;
gdc.gridy = 1;
erstellen.add(lblInfo, gdc);
txtErstName = new JTextField(10);
txtErstName.setToolTipText("Geben Sie den Nachnamen ein");
gdc.gridx = 1;
gdc.gridy = 1;
erstellen.add(txtErstName, gdc);
lblInfo = new JLabel("Vorname");
gdc.gridx = 0;
gdc.gridy = 2;
erstellen.add(lblInfo, gdc);
txtErstVorname = new JTextField(10);
txtErstVorname.setToolTipText("Geben Sie den Vornamen ein.");
gdc.gridx = 1;
gdc.gridy = 2;
erstellen.add(txtErstVorname, gdc);
lblInfo = new JLabel("Strasse");
gdc.gridx = 0;
gdc.gridy = 3;
erstellen.add(lblInfo, gdc);
txtErstStrasse = new JTextField(10);
txtErstStrasse.setToolTipText("Geben Sie die Straße ein.");
gdc.gridx = 1;
gdc.gridy = 3;
erstellen.add(txtErstStrasse, gdc);
lblInfo = new JLabel("PLZ");
gdc.gridx = 0;
gdc.gridy = 4;
erstellen.add(lblInfo, gdc);
ftfErstPLZ = new JFormattedTextField("#####");
ftfErstPLZ.setToolTipText("Eingabe der fünfstelligen PLZ.");
gdc.gridx = 1;
gdc.gridy = 4;
erstellen.add(ftfErstPLZ, gdc);
lblInfo = new JLabel("Ort");
gdc.gridx = 0;
gdc.gridy = 5;
erstellen.add(lblInfo, gdc);
txtErstOrt = new JTextField(10);
txtErstOrt.setToolTipText("Ort des Mitarbeiters");
gdc.gridx = 1;
gdc.gridy = 5;
erstellen.add(txtErstOrt, gdc);
lblInfo = new JLabel("Telefon");
gdc.gridx = 0;
gdc.gridy = 6;
erstellen.add(lblInfo, gdc);
ftfErstTel = new JFormattedTextField();
ftfErstTel.setToolTipText("Telefonnummer");
gdc.gridx = 1;
gdc.gridy = 6;
erstellen.add(ftfErstTel, gdc);
lblInfo = new JLabel("eMail");
gdc.gridx = 0;
gdc.gridy = 7;
erstellen.add(lblInfo, gdc);
txtErstEmail = new JTextField(10);
txtErstEmail.setToolTipText("eMail Adresse des Mitarbeiters");
gdc.gridx = 1;
gdc.gridy = 7;
erstellen.add(txtErstEmail, gdc);
btnErstellen = new JButton("Erstellen");
btnErstellen.setToolTipText("Ausführen der Aktion 'Erstellen eines Mitarbeiters'.");
// === Panel Button für Mitarbeiter erstellen ===
JPanel erstellenBtn = new JPanel();
erstellenBtn.setLayout(gridbag);
erstellenBtn.setBorder(BorderFactory.createLoweredBevelBorder());
gdc.gridx = 0; gdc.gridy = 0;
erstellenBtn.add(btnErstellen);
btnErstellen.addActionListener(this);
//=== Panel für das Suchenfeld ===
........
//=== Panel für den Suchen Button ===
........
// <<< DATABASE - Mitarbeitertabelle >>>
tblAnzeige = performTabelle();
scrolltabelle = new JScrollPane(tblAnzeige);
/*
* Hauptpanel - die ganzen Panels werden in einem Haupt GridBagLayout
* zusammengepickt
*/
JPanel hauptpanel = new JPanel();
hauptpanel.setLayout(gridbag);
gdc.gridx = 0;
gdc.gridy = 0;
hauptpanel.add(suchen, gdc);
gdc.gridx = 1;
gdc.gridy = 0;
hauptpanel.add(bearbeiten, gdc);
gdc.gridx = 1;
gdc.gridy = 1;
hauptpanel.add(aktiontitelpanel, gdc);
gdc.gridx = 2;
gdc.gridy = 0;
hauptpanel.add(erstellen, gdc);
gdc.gridx = 2;
gdc.gridy = 1;
gdc.weighty = 0;
hauptpanel.add(erstellenBtn, gdc);
/* *** Das Hauptlayout alias BorderLayout *** */
setLayout(new BorderLayout());
add(hauptpanel, BorderLayout.NORTH);
add(scrolltabelle, BorderLayout.CENTER);
}
public JTable performTabelle()
{
try {
String sql = "SELECT * FROM Mitarbeiter";
Statement stmt = dbc.getDatabaseConnection().createStatement();
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
tblAnzeige = new JTable(DBUtils.resultSetToTableModel(rs));
return tblAnzeige;
} catch (Exception ex) {
System.out.println(ex);
return null;
}
}
public void actionPerformed(ActionEvent e)
{
Object obj;
.......
} else if (e.getSource() == btnErstellen) {
try {
String sql = "INSERT INTO Mitarbeiter(nachname, vorname, straße, "+
"plz, ort, tel, email) VALUES(";
//sql += ftfErstMitarbNr.getText() + ", '";
sql += "'"+ txtErstName.getText() + "', '";
sql += txtErstVorname.getText() + "', '";
sql += txtErstStrasse.getText() + "', ";
sql += ftfErstPLZ.getText() + ", '";
sql += txtErstOrt.getText() + "', '";
sql += ftfErstTel.getText() + "', '";
sql += txtErstEmail.getText() + "')";
System.out.println(sql);
Statement stmt = dbc.getDatabaseConnection().createStatement();
stmt.execute(sql);
tblAnzeige = performTabelle();
scrolltabelle.revalidate();
stmt.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
Mein "Tabellenmodell", es arbeitet nur mit ResultSet
Java:
public class DBUtils
{
public DBUtils()
{
}
public static TableModel resultSetToTableModel(ResultSet rs)
{
try
{
ResultSetMetaData metaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();
Vector columnNames = new Vector();
// Get the column names
for (int column = 0; column < numberOfColumns; column++) {
columnNames.addElement(metaData.getColumnLabel(column + 1));
}
// Get all rows.
Vector rows = new Vector();
while (rs.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= numberOfColumns; i++) {
newRow.addElement(rs.getObject(i));
}
rows.addElement(newRow);
}
return new DefaultTableModel(rows, columnNames);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
DBConnect
Java:
public class DBConnect
{
private String treiber = "net.sourceforge.jtds.jdbc.Driver";
private String servertyp = "jdbc:jtds:sqlserver://";
private String serveradresse = "192.168.1.6:1433/";
private String datenbank = "Hausverwaltung";
private String benutzer = "sa";
protected DBConnect()
{
}
public Connection getDatabaseConnection()
{
Connection con = null;
try
{
Class.forName(treiber);
}
catch (ClassNotFoundException ex)
{
System.out.println("Kein Treiber gefunden");
}
try
{
return con = DriverManager.getConnection(servertyp+serveradresse+
datenbank, benutzer, "" );
}
catch (SQLException ex)
{
System.out.println("Keine Serververbindung");
return con;
}
}
}
Die einfachste Überlegung die ich angestellt habe, die Query SELECT * FROM ... einfach neu abschicken und die Tabelle neu setzen (Funktion performTabelle()). Was aber nicht so funktioniert wie ich es gedacht hatte.
.revalidate() richtet es leider auch nicht.
So komm ich wohl bei dem Tabellenmodell nicht drumrum dort anzusetzen aber wie stelle ich dies bei meiner Vorlage (DBUtils) am Besten an? Auch so das nicht nur neue Datensätze angezeigt werden, sondern auch Veränderungen (UPDATE und DELETE) gleich übernommen werden?
Über jede Hilfe wäre ich sehr dankbar.