Swing GUI Updateproblem

AlexD1979

Erfahrenes Mitglied
Hallo!
Ich habe schlicht und ergreifend ein Updateproblem einer Swing-Oberfläche! Ich versuche immer wieder die Oberfläche dadurch updaten zu lassen, in dem ich die Methode für den Aufbau einer JTable aufrufen lasse und somit eigentlich für einen Neuaufbau sorge. Nur mache ich das Fenster klein und wieder groß, schon sind die Änderungen weg!!

Ich bekomme noch ne Krise, ich muss eigentlich schon längst fertigs ein mit dem Projekt!!!

Wer kann mir da Hilfestellung geben?
 

Anhänge

  • main_menu.txt
    73,3 KB · Aufrufe: 83

Thomas Darimont

Erfahrenes Mitglied
Servus!

Leider kann ich dein Programm nicht on-the-fly testen, da du überall auf eine DB - Verbindung bestehst ...

also wo genau liegt dein Problem?
Was wird nicht aktualisiert ...?

Es gibt unter Swing die Möglichkeiten:

(JPanel)

void
updateUI()
Resets the UI property with a value from the current look and feel.

(Component)
void
validate()
Ensures that this component has a valid layout.

(JComponent)
void
revalidate()
Supports deferred automatic layout.

void
updateUI()
Resets the UI property to a value from the current look and feel.

...veruschs mal damit ...

Gruß Tom

Ps.: Bai mal überall, wo du ne DB-COnnection vorraussetzt noch ein ... oder eben was anderes, nur lass das Programm nicht so auf die Nase fallen ;-)

if ( con == null){
throw new Exception("Keine DB Verbindung vorhanden!");
}
 

AlexD1979

Erfahrenes Mitglied
Also folgendes Problem...

Ich erstelle mit einer Maske einen neuen Datensatz, der über den Speichern-Button in die Datenbank eingefügt wird.

Unten links ist eine J-Table die zum Programmstart mit einer Methode mit den Datensätzen aus der Datenbank gefüllt wird.

Wenn ich nun den Datensatz schreibe, soll er diesen
a) in die Datenbank einfügen
b) soll auch in der JTable erscheinen.

Ich dachte mir, ich rufe einfach die Methode zum Aufbau der JTable noch mal auf, aber das ist es leider nicht. Ich weiß nicht genau wie ich das realisieren soll. In einer JTable ist die View von den Daten getrennt. Ich füge wohl immer nur die Daten in die View ein. Es erscheint zwar nach dem Speichern in der JTable, aber wenn ich mal das Panel wechsle, ist der Datensatz wieder verschwunden aus der JTable.

Anbei ein Screenshot der Applikation
 

Anhänge

  • screen01.zip
    73,4 KB · Aufrufe: 28

Dominik Haubrich

Administrator
Das Posting stammt von Tom. Er kommt vom Büro nicht auf Tutorials.de und hat mich gebeten, den Beitrag stellvertretend für ihn hier zu veröffentlichen :)


Servus! Vielleicht hilft die das hier ja weiter ...


Code:
import java.util.*;

 

/*

 * JTableTest1.java

 *

 * Created on 31. Juli 2003, 09:11

 */

 

/**

 *

 * @author  Darimont

 */

public class JTableTest1 extends javax.swing.JFrame implements TableData{

    

    private Vector v;

    

    /** Creates new form JTableTest1 */

    public JTableTest1() {

        initComponents();

        

        v = new Vector(30);

    }

    

    private void getData(){

        

        v.clear();

        

        for(int i = 0; i < jTable1.getModel().getRowCount(); i++){

            v.add(new Zeile((String)jTable1.getModel().getValueAt(i, 0),

                            (String)jTable1.getModel().getValueAt(i, 1),

                            (String)jTable1.getModel().getValueAt(i, 2)));

        }

        

        for(int i = 0; i < v.size(); i++)

            System.out.println((Zeile)v.elementAt(i));

        

        

        v.add(new Zeile(jTextField1.getText(),jTextField2.getText(),jTextField3.getText()));

        

        for(int i = 0; i < v.size(); i++)

            System.out.println((Zeile)v.elementAt(i));

        

        jTable1.setModel(new javax.swing.table.DefaultTableModel(makeChanges(),COLHEADS)); 

        

    }

    

    public Object[][] makeChanges(){

        Object[][] o = new Object[v.size()][jTable1.getColumnCount()];

        

        for(int i = 0; i <o.length; i++){

            o[i] = ((Zeile)v.elementAt(i)).getSpalten();

        }

        

        return o;

        

    }

    

    

    

    /** 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;

 

        jPanel1 = new javax.swing.JPanel();

        jScrollPane1 = new javax.swing.JScrollPane();

        jTable1 = new javax.swing.JTable(DATA,COLHEADS);

        jPanel2 = new javax.swing.JPanel();

        jLabel1 = new javax.swing.JLabel();

        jTextField1 = new javax.swing.JTextField();

        jLabel2 = new javax.swing.JLabel();

        jTextField2 = new javax.swing.JTextField();

        jLabel3 = new javax.swing.JLabel();

        jTextField3 = new javax.swing.JTextField();

        jButton1 = new javax.swing.JButton();

 

        addWindowListener(new java.awt.event.WindowAdapter() {

            public void windowClosing(java.awt.event.WindowEvent evt) {

                exitForm(evt);

            }

        });

 

        jPanel1.setMinimumSize(new java.awt.Dimension(400, 350));

        jPanel1.setPreferredSize(new java.awt.Dimension(400, 350));

        jScrollPane1.setMinimumSize(new java.awt.Dimension(400, 350));

        jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 350));

        jTable1.setModel(

            new javax.swing.table.DefaultTableModel(DATA,COLHEADS));

        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);

        jScrollPane1.setViewportView(jTable1);

 

        jPanel1.add(jScrollPane1);

 

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

 

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

 

        jPanel2.setMinimumSize(new java.awt.Dimension(400, 50));

        jPanel2.setPreferredSize(new java.awt.Dimension(400, 50));

        jLabel1.setText("Ausgabe");

        jPanel2.add(jLabel1, new java.awt.GridBagConstraints());

 

        jTextField1.setText("                              ");

        jPanel2.add(jTextField1, new java.awt.GridBagConstraints());

 

        jLabel2.setText("Seiten");

        jPanel2.add(jLabel2, new java.awt.GridBagConstraints());

 

        jTextField2.setText("                              ");

        jPanel2.add(jTextField2, new java.awt.GridBagConstraints());

 

        jLabel3.setText("Titelthema");

        gridBagConstraints = new java.awt.GridBagConstraints();

        gridBagConstraints.gridx = 0;

        gridBagConstraints.gridy = 1;

        jPanel2.add(jLabel3, gridBagConstraints);

 

        jTextField3.setText("                              ");

        gridBagConstraints = new java.awt.GridBagConstraints();

        gridBagConstraints.gridx = 1;

        gridBagConstraints.gridy = 1;

        jPanel2.add(jTextField3, gridBagConstraints);

 

        jButton1.setText("Hinzuf\u00fcgen");

        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {

            public void mousePressed(java.awt.event.MouseEvent evt) {

                jButton1MousePressed(evt);

            }

        });

 

        gridBagConstraints = new java.awt.GridBagConstraints();

        gridBagConstraints.gridx = 3;

        gridBagConstraints.gridy = 1;

        jPanel2.add(jButton1, gridBagConstraints);

 

        getContentPane().add(jPanel2, java.awt.BorderLayout.NORTH);

 

        pack();

    }

 

    private void jButton1MousePressed(java.awt.event.MouseEvent evt) {

        // Add your handling code here:

        getData();

    }

    

    /** Exit the Application */

    private void exitForm(java.awt.event.WindowEvent evt) {

        System.exit(0);

    }

    

    /**

     * @param args the command line arguments

     */

    public static void main(String args[]) {

        new JTableTest1().show();

    }

    

    class Zeile {

        String spalte1;

        String spalte2;

        String spalte3;

        

        public Zeile(String c1, String c2, String c3){

            spalte1 = c1;

            spalte2 = c2;

            spalte3 = c3;

        }

        

        public Object[] getSpalten(){

            return new Object[]{spalte1,spalte2,spalte3};

        }

        

        /** Getter for property spalte1.

         * @return Value of property spalte1.

         *

         */

        public java.lang.String getSpalte1() {

            return spalte1;

        }        

        

        /** Setter for property spalte1.

         * @param spalte1 New value of property spalte1.

         *

         */

        public void setSpalte1(java.lang.String spalte1) {

            this.spalte1 = spalte1;

        }        

        

        /** Getter for property spalte2.

         * @return Value of property spalte2.

         *

         */

        public java.lang.String getSpalte2() {

            return spalte2;

        }

        

        /** Setter for property spalte2.

         * @param spalte2 New value of property spalte2.

         *

         */

        public void setSpalte2(java.lang.String spalte2) {

            this.spalte2 = spalte2;

        }

        

        /** Getter for property spalte3.

         * @return Value of property spalte3.

         *

         */

        public java.lang.String getSpalte3() {

            return spalte3;

        }

        

        /** Setter for property spalte3.

         * @param spalte3 New value of property spalte3.

         *

         */

        public void setSpalte3(java.lang.String spalte3) {

            this.spalte3 = spalte3;

        }

        

        public String toString() {

            return spalte1 + " " + spalte2 + " " + spalte3;

        }

        

    }

    

    

    // Variables declaration - do not modify

    private javax.swing.JButton jButton1;

    private javax.swing.JLabel jLabel1;

    private javax.swing.JLabel jLabel2;

    private javax.swing.JLabel jLabel3;

    private javax.swing.JPanel jPanel1;

    private javax.swing.JPanel jPanel2;

    private javax.swing.JScrollPane jScrollPane1;

    private javax.swing.JTable jTable1;

    private javax.swing.JTextField jTextField1;

    private javax.swing.JTextField jTextField2;

    private javax.swing.JTextField jTextField3;

    // End of variables declaration

    

}



Hier das TableData Interface aus dem Handbuch der Javaprogrammierung:



Code:
/*

 * TableData.java

 *

 * Created on 31. Juli 2003, 09:22

 */

 

/**

 *

 * @author  Darimont

 */

 public interface TableData

 {

   public static final String[][] DATA = {

     {" 1/1987", "195", "Vergleichstest EGA-Karten"},

     {" 2/1987", "171", "Schneider PC: Bewährungsprobe"},

     {" 3/1987", "235", "Luxus-Textsyteme im Vergleich"},

     {" 4/1987", "195", "Turbo BASIC"},

     {" 5/1987", "211", "640-K-Grenze durchbrochen"},

     {" 6/1987", "211", "Expertensysteme"},

     {" 7/1987", "199", "IBM Model 30 im Detail"},

     {" 8/1987", "211", "PAK-68: Tuning für 68000er"},

     {" 9/1987", "215", "Desktop Publishing"},

     {"10/1987", "279", "2,5 MByte im ST"},

     {"11/1987", "279", "Transputer-Praxis"},

     {"12/1987", "271", "Preiswert mit 24 Nadeln"},

     {" 1/1988", "247", "Schnelle 386er"},

     {" 2/1988", "231", "Hayes-kompatible Modems"},

     {" 3/1988", "295", "TOS/GEM auf 68020"},

     {" 4/1988", "263", "Projekt Super-EGA"},

     {" 5/1988", "263", "Neuheiten auf der CeBIT 88"},

     {" 6/1988", "231", "9600-Baud-Modem am Postnetz"}

   };

 

   public static final String[] COLHEADS = {

     "Ausgabe", "Seiten", "Titelthema"

   };

}



Gruß Tom
 

AlexD1979

Erfahrenes Mitglied
Hey !!
Vielen Dank für die Mühen, das du über Umwege geantwortet hast!
Das Beispiel ist klasse und verdeutlicht mir einiges!!

Gruß an euch beide

Alexander
 

AlexD1979

Erfahrenes Mitglied
... aber leider hilft es mir bei meinem eigenen Problem nicht weiter =:eek:((((

Ich poste mal den Quelltextabschnitt, um den es geht!

// 2 = Benutzer neu anlegen und auf die Datenbank ein Insert anwenden
}
if (var_save == 2) {
try {
String temp1 = tf_uname.getText();
String temp2 = tf_pass.getText();

sql =
"INSERT INTO DB_USER(ID,USERNAME,PASSWORD) VALUES(USER_SEQ.NEXTVAL,UPPER('"
+ temp1
+ "'),UPPER('"
+ temp2
+ "'))";

Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery(sql);
result.close();
stmt.close();

tf_uname.setText("");
tf_pass.setText("");

status.setText(
"Benutzer "
+ temp1
+ " erfolgreich angelegt und aktiviert!");
//Ende des INSERT

//Identifier-Variable wieder auf 0 setzen
var_save = 0;

//Erneutes Einlesen der Datanbank
sql = "SELECT ID,USERNAME FROM DB_USER ORDER BY ID";

stmt = con.createStatement();
result = stmt.executeQuery(sql);

ResultSetMetaData metaData = result.getMetaData();
int numberOfColumns = metaData.getColumnCount();
Vector columnNames = new Vector();

//Erzeugen der Spaltenüberschriften
columnNames.addElement("ID");
columnNames.addElement("Benutzer");

//Alle Reihen einlesen
Vector rows = new Vector();
while (result.next()) {
Vector newRow = new Vector();
for (int i = 1; i <= metaData.getColumnCount(); i++) {
newRow.addElement(result.getObject(i));
}
rows.addElement(newRow);
}

//neues Datenmodell setzen und tabellenkomponente updaten
tp.setSelectedIndex(0);
tabelle.setModel(new DefaultTableModel(rows, columnNames));
tabelle.updateUI();
//Funktionier leider nicht!! Kein Update

} catch (SQLException exp) {
JOptionPane.showMessageDialog(
null,
"Fehler beim Anlegen des Datensatzes",
"Administration - Themenbereich - Eingabe",
JOptionPane.ERROR_MESSAGE);
}

WO MACHE ICH DEN FEHLER?? Ich verzweifle noch ich dokter schon fast 3 Wochen an der Sache rum!! ISt echt dringend das das fertig wird
 

Thomas Darimont

Erfahrenes Mitglied
Servus!

auf den schnellen Blick müsste das auch funktionieren ... hmmm

na ja hier mal (quick & dirty) ein Beispiel zu der gewünschten Funktionalität:

Code:
import java.sql.*;
import java.util.*;


/*
 * DBGui.java
 *
 * Created on 8. August 2003, 07:57
 */

/**
 *
 * @author  Darimont
 */
public class DBGui extends javax.swing.JFrame {
    private Object[][] or;
    private Object[] th;
    private Vector vData;
    private Connection con;
    private ResultSetMetaData rsmd;
    private ResultSet rsGetData;
    private Statement stmt;
    private PreparedStatement pstmt;
    
    /** Creates new form DBGui */
    public DBGui() {
        initComponents();
        vData = new Vector(20);
        initDB();
        showData();
    }
    
    private void showData(){
        try{
            rsGetData = stmt.executeQuery("SELECT * from tblUser");
            StringBuffer colm = new StringBuffer(20);
            int row = 0;
            while(rsGetData.next()){
                Object[] o = new Object[rsGetData.getMetaData().getColumnCount()];
                for(int i = 1; i <= rsGetData.getMetaData().getColumnCount(); i++){
                    colm.append((o[i-1] = rsGetData.getString(i))+" ");
                }
                System.out.println(colm.toString());
                colm.delete(0, colm.length());
                vData.addElement(o);
                or = new Object[vData.size()][o.length];
                for(int i = 0; i < or.length; i++)
                    or[i] = (Object[])vData.elementAt(i);
                rsmd = rsGetData.getMetaData();
                th = new Object[rsmd.getColumnCount()];
                for(int j = 0; j < rsmd.getColumnCount(); j++)
                    th[j] = rsmd.getColumnName(j+1);
            }
        }catch(Exception e){e.printStackTrace();}
        vData.clear();
        jTable1.setModel(new javax.swing.table.DefaultTableModel(or, th));
    }
    
    private void setData(){
        try{
            String str;
            if ((str = jTF_user.getText()) != null){
                pstmt.setString(1, str);
                pstmt.execute();
            }
            showData();
        }catch(Exception e){ e.printStackTrace(); }
    }
    private void initDB(){
        try{
            Thread.currentThread().getContextClassLoader().loadClass("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
            con = DriverManager.getConnection("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:/test.mdb","Administrator","");
            stmt = con.createStatement();
           pstmt = con.prepareStatement("INSERT INTO tblUser (username) VALUES(?);");
       }catch(Exception e){ e.printStackTrace();}
    }
    
    /** 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() {
        jPanel1 = new javax.swing.JPanel();
        jSplitPane1 = new javax.swing.JSplitPane();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jTF_user = new javax.swing.JTextField();
        JBtn_anlegen = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setTitle("DB TEST");
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setMinimumSize(new java.awt.Dimension(400, 300));
        jPanel1.setPreferredSize(new java.awt.Dimension(400, 300));
        jSplitPane1.setMinimumSize(new java.awt.Dimension(400, 300));
        jSplitPane1.setPreferredSize(new java.awt.Dimension(400, 300));
        jPanel2.setMinimumSize(new java.awt.Dimension(200, 300));
        jPanel2.setPreferredSize(new java.awt.Dimension(200, 300));
        jLabel1.setText("Neuen Benutzer anlegen:");
        jPanel2.add(jLabel1);

        jTF_user.setColumns(15);
        jPanel2.add(jTF_user);

        JBtn_anlegen.setText("anlegen");
        JBtn_anlegen.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                JBtn_anlegenMousePressed(evt);
            }
        });

        jPanel2.add(JBtn_anlegen);

        jButton1.setText("refresh");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jButton1MousePressed(evt);
            }
        });

        jPanel2.add(jButton1);

        jSplitPane1.setLeftComponent(jPanel2);

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

        jPanel3.setMinimumSize(new java.awt.Dimension(200, 300));
        jPanel3.setPreferredSize(new java.awt.Dimension(200, 300));
        jScrollPane1.setMinimumSize(new java.awt.Dimension(190, 280));
        jScrollPane1.setPreferredSize(new java.awt.Dimension(190, 280));
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jTable1.setEnabled(false);
        jScrollPane1.setViewportView(jTable1);

        jPanel3.add(jScrollPane1, new java.awt.GridBagConstraints());

        jSplitPane1.setRightComponent(jPanel3);

        jPanel1.add(jSplitPane1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }
    
    private void jButton1MousePressed(java.awt.event.MouseEvent evt) {
        // Add your handling code here:
        showData();
    }
    
    private void JBtn_anlegenMousePressed(java.awt.event.MouseEvent evt) {
        // Add your handling code here:
        setData();
        
    }
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        if(con != null){
            try{
                
                con.close();
                
            }catch(Exception e){e.printStackTrace();}
        }
        
        System.exit(0);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new DBGui().show();
    }
    
    class Zeile {
        
        String[] spalten;
        
        public Zeile(String[] s){
            
            spalten = new String[s.length];
            System.arraycopy(s, 0, spalten, 0, s.length);
        }
        
        public Object[] getSpalten(){
            //return new Object[spalten.length]{};
            return spalten;
        }
        
        public java.lang.String getSplate(int n){
            return spalten[n];
        }
        
        public void setSplate(int n, String s){
            spalten[n] = s;
        }
        
        
        public String toString() {
            return spalten.toString();
        }
        
    }
    
    // Variables declaration - do not modify
    private javax.swing.JButton JBtn_anlegen;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSplitPane jSplitPane1;
    private javax.swing.JTextField jTF_user;
    private javax.swing.JTable jTable1;
    // End of variables declaration
    
}

Gruß Tom
 

Anhänge

  • test.zip
    10 KB · Aufrufe: 29

Neue Beiträge