Hi,
vor ein paar Wochen habe ich einen Thread eröffnet, indem es um die Anwendungs des Cardlayouts ging (Thread). Dank eurer Hilfe konnte ich das Problem lösen und es mMn auch relativ gut umsetzen
Ok, habe das nun kurz angesprochen, da dies vielleicht auch mit meinem aktuellen Problem zu tun hat (Code dazu kommt weiter unten).
Mein aktuelles Problem: Ich habe mir aus einem JTable einen kleine Kalender gebastelt. Dieser Kalender holt sich aus einer Embedded DB (h2) die vorliegenden Termine und gibt diese an den entsprechenden Tagen wieder. Bei Programmstart funktioniert dieses einwandfrei. Ich kann zwischen den Monaten hin- und herschalten und die aktuellen Tage werden aus der Datenbank entnommen und korrekt dargestellt.
Jetzt habe ich zum Test ein kleines Formular gebastelt (noch ohne Eingabekontrollen etc) um neue Termine hinzuzufügen. Sobald ich nun einen Termin hinzufüge, wird dieser in die Datenbank eingetragen (funktioniert), jedoch wird das JTable mit dem Kalender nicht aktualisiert. Erst bei Neustart des Programmes oder beim hin- und herschalten der Monate wird der neue Termin angezeigt.
Habe versucht das Tablemodel mit fireTableDataChanged() zu aktualisieren, auch JTable.repaint(), revalidate() haben keinerlei Wirklung gezeigt.
Um nicht mein kompletten Chaoscode (bin noch Anfänger und kriege das MVC Konzept nicht sauber umgesetzt) zu posten, schreibe ich erstmal nur die Stellen, die mir wichtig erscheinen. Am Ende schreibe ich nochmal, wo ich die Fehler vermuten würde.
Klasse Navi: erstellt Buttons zur Auswahl der Cards inkl. Eventlistener
Klasse Content: Setzt das Cardlayout und fügt Panels hinzu (Hier vermute ich evtl. einen Fehler)
Klasse Events: Um den Code kurz zu halten, poste ich hier nur die Events Klasse (Events wird über den Button Veranstaltungen aufgerufen. Es wird eine einfache JTable mit allen Terminen angezeigt)
Klasse NewEvent: Dies ist einfach nur ein Testformular um neue Datensätze während der Laufzeit des Programmes einzufügen. Es gibt keine Eingabekontrollen oder Sonstiges (also darauf achten, was man eingibt)
Das wars erstmal vom Code, hoffe habe das nötigste nicht rausgelöscht (wollte halt nicht das Forum sprengen
)
Habe die ganzen fireTableDataChanged(), repaint() und revalidate() mal wieder rausgenommen. Habe diese Methoden zum Test echt überall mal eingefügt mit der Hoffnung, dass es irgendwann mal funktioniert.
Ich vermute nun den Fehler bei: 1. fireTable... repaint und revalidate werden an den falschen Stellen aufgerufen bzw. nicht korrekt ans Tablemodel übergeben oder 2. in der Klasse Content werden die Panels einmal aufgerufen (z.b. durch new Events()
und danach durch das Cardlayout nur angezeigt bzw. ausgeblendet. Die Klasse Events() wird also bei erneutem Aufruf nicht neu geladen bzw. aktualisiert sondern einfach nur wieder eingeblendet (mit den alten Daten).
Das Gleiche Problem besteht halt auch bei meiner Overview Klasse (dort ist das JTable als Kalender dargestellt).
Und mal wieder ist mein Post recht lang geworden. Wusste nicht, wie ich mein Problem genauer schildern soll. Habe auch schon im Internet und in diesem Forum nach ähnlichen Problemen gesucht, jedoch hat mir nichts wirklich geholfen.
Mein Code ist relativ chaotisch, besonders weil ich das MVC-Konzept in einigen andere Klassen gut umsetzen konnte und dann teilweise wieder doch nicht. Hoffe jedoch, dass meine Codeschnipsel verständlich sind.
Ich hoffe auf erneute Hilfe eurerseits und bedanke mich im Voraus.
Mit freundlichem Gruß
chris
vor ein paar Wochen habe ich einen Thread eröffnet, indem es um die Anwendungs des Cardlayouts ging (Thread). Dank eurer Hilfe konnte ich das Problem lösen und es mMn auch relativ gut umsetzen
Ok, habe das nun kurz angesprochen, da dies vielleicht auch mit meinem aktuellen Problem zu tun hat (Code dazu kommt weiter unten).
Mein aktuelles Problem: Ich habe mir aus einem JTable einen kleine Kalender gebastelt. Dieser Kalender holt sich aus einer Embedded DB (h2) die vorliegenden Termine und gibt diese an den entsprechenden Tagen wieder. Bei Programmstart funktioniert dieses einwandfrei. Ich kann zwischen den Monaten hin- und herschalten und die aktuellen Tage werden aus der Datenbank entnommen und korrekt dargestellt.
Jetzt habe ich zum Test ein kleines Formular gebastelt (noch ohne Eingabekontrollen etc) um neue Termine hinzuzufügen. Sobald ich nun einen Termin hinzufüge, wird dieser in die Datenbank eingetragen (funktioniert), jedoch wird das JTable mit dem Kalender nicht aktualisiert. Erst bei Neustart des Programmes oder beim hin- und herschalten der Monate wird der neue Termin angezeigt.
Habe versucht das Tablemodel mit fireTableDataChanged() zu aktualisieren, auch JTable.repaint(), revalidate() haben keinerlei Wirklung gezeigt.
Um nicht mein kompletten Chaoscode (bin noch Anfänger und kriege das MVC Konzept nicht sauber umgesetzt) zu posten, schreibe ich erstmal nur die Stellen, die mir wichtig erscheinen. Am Ende schreibe ich nochmal, wo ich die Fehler vermuten würde.
Klasse Navi: erstellt Buttons zur Auswahl der Cards inkl. Eventlistener
Java:
public Navi(Content mainPanel) {
this.mainPanel = mainPanel;
this.setBorder(javax.swing.BorderFactory.createTitledBorder("Menü"));
this.setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
jButton1 = new javax.swing.JButton("Übersicht");
jButton2 = new javax.swing.JButton("Veranstaltungen");
jLabel1 = new JLabel();
jLabel1.setVisible(false);
jPanel1 = new JPanel();
jButton1.addActionListener(this);
jButton2.addActionListener(this);
jButton1.setMaximumSize(new Dimension(150, 24));
jButton2.setMaximumSize(new Dimension(150, 24));
// In dieser Methode änderst du das anzuzeigende Panel
// über die showPanel-Methode in mainPanel
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Übersicht"))
mainPanel.showPanel("Overview");
if(e.getActionCommand().equals("Veranstaltungen"))
mainPanel.showPanel("Events");
}
}
Klasse Content: Setzt das Cardlayout und fügt Panels hinzu (Hier vermute ich evtl. einen Fehler)
Java:
public class Content extends javax.swing.JPanel {
private CardLayout cardLayout;
public JPanel panel1, panel2, panel3, panel4, panel5, panel7;
public Content() {
//Panel für den Inhalt wird erstellt und mit CardLayout versehen
cardLayout = new CardLayout();
this.setLayout(cardLayout);
//Es werden 3 Panels für den Inhalt erstellt (kann erweitert werden)
panel1=new JPanel();
panel2=new JPanel();
//Panel "Karten" initialisieren
panel1.add(new Overview()); //Panel: Übersicht
panel2.add(new Events()); //Panel: Veranstaltungen
//Karten dem Panel hinzufügen
this.add(panel1,"Overview");
this.add(panel2,"Events");
}
//gewählte Karte anzeigen
public void showPanel(String panel) {
cardLayout.show(this, panel);
}
Klasse Events: Um den Code kurz zu halten, poste ich hier nur die Events Klasse (Events wird über den Button Veranstaltungen aufgerufen. Es wird eine einfache JTable mit allen Terminen angezeigt)
Java:
public class Events extends javax.swing.JPanel {
DefaultTableModel model = new DefaultTableModel();
JTable tab;
/** Creates new form Events */
public Events() {
initComponents();
String query = "SELECT * from termine ORDER BY datum ASC";
abfragen(query); //SQL String an abfragen() übergeben
myUpdate();
setVisible(true);
}
/** 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.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
setBorder(javax.swing.BorderFactory.createTitledBorder("Veranstaltungen"));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 434, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>
private void abfragen(String query)
{
Connection conn = Connect.driver(); //Verbindung herstellen
Statement stm = Communication.stm(conn); //Statement mit Verbindung erstellen
ResultSet rs = Communication.rs(query,stm); //SQL String sowie Statement an Resultset übergeben, query wird ausgeführt
tableModelEvents(rs); //ResultSet wird ans TM übergeben
try {
conn.close();
}
catch(Exception error){error.printStackTrace();}
}
private void tableModelEvents(ResultSet rs)
{
//Tabellenkopf Überschriften
String datum,bez,kunde,pers,raum,beginn;
datum="Datum";
bez="Bezeichnung";
kunde="Kunde";
pers="Personen";
raum="Raum";
beginn="Beginn";
//Tabellenkopf Überschriften zu addColumn
model.addColumn(datum);
model.addColumn(bez);
model.addColumn(kunde);
model.addColumn(pers);
model.addColumn(raum);
model.addColumn(beginn);
//Vektor der Überschriften erstellen und ans TM übergeben
Vector vectorHead = new Vector();
vectorHead.add(datum);
vectorHead.add(bez);
vectorHead.add(kunde);
vectorHead.add(pers);
vectorHead.add(raum);
vectorHead.add(beginn);
model.setColumnIdentifiers(vectorHead);
//Ausgabe der Datensätze in Vektor. Inhalte werden ans TM übergeben
try{
while(rs.next())
{
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
String dateFormat = formatter.format(rs.getDate("datum"));
String switchDate[] = dateFormat.split("\\.");
System.out.println(switchDate[0]); //Kontrollausgabe
Vector vectorData = new Vector();
vectorData.add(dateFormat);
vectorData.add(rs.getString("bezeichnung"));
vectorData.add(rs.getString("kunde"));
vectorData.add(rs.getString("personen"));
vectorData.add(rs.getString("raum"));
vectorData.add(rs.getString("beginn"));
model.addRow(vectorData);
}
}
catch(Exception error){error.printStackTrace();}
}
//##############################
public final void myUpdate() {
System.out.println("bla");
try {
tab = new JTable(model) {
public boolean isCellEditable(int x, int y) { //Zellen nicht editierbar
return false;
}
};
//Tabelleneigenschaften (Anordnung bzw. Größe cht änderbar)
tab.setRowHeight(25);
tab.getTableHeader().setResizingAllowed(false);
tab.getTableHeader().setReorderingAllowed(false);
tab.setShowHorizontalLines(true);
tab.setShowVerticalLines(false);
tab.getModel();
jScrollPane1.setViewportView(tab);
} catch (Exception error){ System.out.println(error); }
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration
}
Klasse NewEvent: Dies ist einfach nur ein Testformular um neue Datensätze während der Laufzeit des Programmes einzufügen. Es gibt keine Eingabekontrollen oder Sonstiges (also darauf achten, was man eingibt)
Java:
public class NewEvent extends javax.swing.JPanel {
String datum, bezeichnung, kunde, beginn, raum, dekoration, aufbaubeginn;
Integer personen;
Boolean sekt, bedienung, dj, anzahlung;
private PreparedStatement psInsert = null;
private Overview Overview = null;
private Events Events = null;
/** Creates new form NewEvent */
public NewEvent() {
initComponents();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
getValues(); // TODO add your handling code here:
addEvent();
}
public void getValues() {
datum = jTextField1.getText();
bezeichnung = jTextField5.getText();
kunde = jTextField2.getText();
beginn = jTextField4.getText();
raum = jComboBox1.getSelectedItem().toString();
personen = Integer.parseInt(jTextField3.getText());
sekt = jCheckBox1.isSelected();
bedienung = jCheckBox2.isSelected();
dj = jCheckBox3.isSelected();
anzahlung = jCheckBox4.isSelected();
dekoration = jTextArea1.getText();
aufbaubeginn = jTextArea2.getText();
}
public void addEvent() {
try {
Connection conn = Connect.driver();
Statement stm = Communication.stm(conn);
String sql = "INSERT INTO TERMINE (datum, bezeichnung, kunde, "
+ "personen, raum, beginn, sekt, bedienung, dj, anzahlung, "
+ "dekoration, aufbaubeginn) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
psInsert = conn.prepareStatement(sql);
psInsert.setString(1, datum);
psInsert.setString(2, bezeichnung);
psInsert.setString(3, kunde);
psInsert.setInt(4, personen);
psInsert.setString(5, raum);
psInsert.setString(6, beginn);
psInsert.setBoolean(7, sekt);
psInsert.setBoolean(8, bedienung);
psInsert.setBoolean(9, dj);
psInsert.setBoolean(10, anzahlung);
psInsert.setString(11, dekoration);
psInsert.setString(12, aufbaubeginn);
psInsert.executeUpdate();
conn.close();
} catch(Exception e) {
System.out.println(e);
}
}
Das wars erstmal vom Code, hoffe habe das nötigste nicht rausgelöscht (wollte halt nicht das Forum sprengen
Habe die ganzen fireTableDataChanged(), repaint() und revalidate() mal wieder rausgenommen. Habe diese Methoden zum Test echt überall mal eingefügt mit der Hoffnung, dass es irgendwann mal funktioniert.
Ich vermute nun den Fehler bei: 1. fireTable... repaint und revalidate werden an den falschen Stellen aufgerufen bzw. nicht korrekt ans Tablemodel übergeben oder 2. in der Klasse Content werden die Panels einmal aufgerufen (z.b. durch new Events()
Das Gleiche Problem besteht halt auch bei meiner Overview Klasse (dort ist das JTable als Kalender dargestellt).
Und mal wieder ist mein Post recht lang geworden. Wusste nicht, wie ich mein Problem genauer schildern soll. Habe auch schon im Internet und in diesem Forum nach ähnlichen Problemen gesucht, jedoch hat mir nichts wirklich geholfen.
Mein Code ist relativ chaotisch, besonders weil ich das MVC-Konzept in einigen andere Klassen gut umsetzen konnte und dann teilweise wieder doch nicht. Hoffe jedoch, dass meine Codeschnipsel verständlich sind.
Ich hoffe auf erneute Hilfe eurerseits und bedanke mich im Voraus.
Mit freundlichem Gruß
chris