Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   JAVA: onChange()-Methode für JComboBox (https://www.delphipraxis.net/59840-java-onchange-methode-fuer-jcombobox.html)

geisi 29. Dez 2005 12:34


JAVA: onChange()-Methode für JComboBox
 
habe auf meinem Formular u.a. zwei JComboBoxes:
JComboBox 1: Hauptkategorien
JComboBox 2: Subkategorien

nun soll, sobald in der Hauptkategorie-Box ein anderer Eintrag ausgewählt wurde, die neuen Subkategorien für diese Hauptkategorie geladen werden.

ich habs mit dem Event: itemStateChanged() probiert:
beim laden der Hauptkategorien aus der Datenbank, bekommen ich jedesmal eine SQLException (Operation not allowed after ResultSet closed). und es wird nur die erste Hauptkategorie geladen.
Wenn ich aber dieses Event deactiviere funktioniert das Laden der Hauptkategorien wieder einwandfrei.

wie kann ich diese problem lösen, bzw. gibt es ein anderes/besseres Event für mein problem?

Der_Unwissende 29. Dez 2005 15:29

Re: JAVA: onChange()-Methode für JComboBox
 
Zitat:

Zitat von geisi
beim laden der Hauptkategorien aus der Datenbank, bekommen ich jedesmal eine SQLException (Operation not allowed after ResultSet closed)

Also was dieses Problem betrifft, so ist die Lösung recht einfach. Du greifst ja in mehreren Schritten auf die DB zu. Du musst eine Connection etablieren, eine Anfrage schicken, erhälst ein ResultSet und schließt die Verbindung wieder. Die Daten im ResultSet sind allerdings nur gültig, solange die Verbindung zur DB aktiv ist. Damit dies nicht unnötig lange der Fall ist, musst du einfach die Daten aus dem ResultSet kopieren, die von dir weiterverarbeitet werden.
Wenn du dies machst (nach abrufen, vor close), so solltest du mit diesen Daten auch in einem beliebigen Ereignis arbeiten können, ohne das irgendein Problem auftritt.
An sich ist es (imho) der Weg, den man wählen sollte, da die Auswertung der Daten des ResultSets durchaus länger dauern kann, während du sicherlich nicht unnötig lange eine Connection zur DB belegen möchtest.

Gruß Der Unwissende

geisi 29. Dez 2005 19:04

Re: JAVA: onChange()-Methode für JComboBox
 
habe hier wieder die Exception "operation not allowed after ResultSet closed" beim zweiten aufruf des result.next()
Delphi-Quellcode:
        try
        {
            rezepte.removeAllElements();          //löscht alle bisherigen Rezepte aus den RezepteModel(TableModel)
            String sql = "SELECT * FROM rezept";
            ResultSet result = db.onSelect(sql);
            while(result.next())
            {
                rezepte.addRezept(new Rezept(result.getInt("RID"), db));
            }
        }
        catch (Exception e)
        {
            String message = "Es konnten nicht alle bzw. keine Rezepte geladen werden!!";
            JOptionPane.showMessageDialog(this,message,"FEHLER",JOptionPane.ERROR_MESSAGE);
            System.out.println("loadRezepteERROR - "+e.toString());
        }
warum??????????

Der_Unwissende 29. Dez 2005 19:14

Re: JAVA: onChange()-Methode für JComboBox
 
Wo findet denn die Verbindung zur Datenbank statt?

geisi 29. Dez 2005 19:28

Re: JAVA: onChange()-Methode für JComboBox
 
Delphi-Quellcode:
import java.sql.*;
import javax.swing.*;

public class KochrezepteFrame extends javax.swing.JFrame
{
    private RezepteModel rezepte;
    private DatenbankConnector db;

    public KochrezepteFrame()
    {
        initComponents();
        try
        {
            this.db = new DatenbankConnector();      //HIER WIRD DIE VERBINDUNG ZUR DATENBANK HERGESTELLT
        }
        catch (Exception e)
        {
            String message = "Es konnte keine Verbindung zur Datenbank hergestellt werden!";
            JOptionPane.showMessageDialog(this,message,"FEHLER",JOptionPane.ERROR_MESSAGE);
            System.out.println(e.toString());
        }
        rezepte= new RezepteModel(db);
        taRezepte.setModel(rezepte);
        loadRezepte();                               // HIER wird die funktion loadRezepte aufgerufen
    }
   
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        taRezepte = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        jMenuBar2 = new javax.swing.JMenuBar();
        jMenu2 = new javax.swing.JMenu();
        miHinzufuegen = new javax.swing.JMenuItem();
        miAendern = new javax.swing.JMenuItem();
        miLoeschen = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        taRezepte.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(taRezepte);

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

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

        jMenu2.setText("Rezept");
        miHinzufuegen.setText("Hinzuf\u00fcgen");
        miHinzufuegen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onHinzufuegen(evt);
            }
        });

        jMenu2.add(miHinzufuegen);

        miAendern.setText("Bearbeiten");
        jMenu2.add(miAendern);

        miLoeschen.setText("L\u00f6schen");
        jMenu2.add(miLoeschen);

        jMenuBar2.add(jMenu2);

        setJMenuBar(jMenuBar2);

        pack();
    }

    private void onHinzufuegen(java.awt.event.ActionEvent evt) {                               
        RezeptDialog dlg = new RezeptDialog(this,true, db);
        dlg.setBounds(250, 50, 540, 780);
        dlg.pack();
        openDialog(dlg);
    }                             
   
    public void openDialog(RezeptDialog dlg)
    {
        dlg.setVisible(true);
        dlg.pack();
        if(dlg.eingabeOK())
        {
            loadRezepte();
        }
        else if(dlg.shouldReOpen())
            openDialog(dlg);
    }
   
    public void loadRezepte()
    {
        try
        {
            rezepte.removeAllElements();
            String sql = "SELECT * FROM rezept";
            ResultSet result = db.onSelect(sql);
            while(result.next())      //HIER wird beim zweiten aufruf der funktion next() die SQLException ausgelöst
            {
                rezepte.addRezept(new Rezept(result.getInt("RID"), db));
            }
        }
        catch (Exception e)
        {
            String message = "Es konnten nicht alle bzw. keine Rezepte geladen werden!!";
            JOptionPane.showMessageDialog(this,message,"FEHLER",JOptionPane.ERROR_MESSAGE);
            System.out.println("loadRezepteERROR - "+e.toString());
        }
    }
   
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new KochrezepteFrame().setVisible(true);
            }
        });
    }
   
    // Variables declaration - do not modify
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JMenuItem miAendern;
    private javax.swing.JMenuItem miHinzufuegen;
    private javax.swing.JMenuItem miLoeschen;
    private javax.swing.JTable taRezepte;
    // End of variables declaration
   
}
hab dir gleich den ganzen code gegeben

hilf mir bitte!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz