[java]JComboBox + form

Pagina: 1
Acties:

  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
Ik heb een probleempje
Ik heb een JComboBox in een JPanel staan. de combobox is gekoppeld aan een mysql database en die leest de variabele uit een kolom. Dit werkt allemaal. Nu wil ik alleen dat als ik een variabele heb gekozen uit de combobox, dat de rest van het formulier de andere data uit de database tabel krijgt en deze automatisch in de textfields komt te staan.

het is een soort van klanten systeem, als je op een klant klikt, wordt de rest van de informatie automatisch al ingevuld in de velden.

dit is de methode die ik gebruik voor de combobox:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void haalArtikel(){
        
        Statement s;
        ResultSet rs = null;
            
        Database database = new Database();
            
        try {    
            database.openCon();
            s = database.connection.createStatement();
            rs = s.executeQuery("SELECT * FROM `order`"); 
            if (rs != null) 
                while ( rs.next() ) {
                    cmbKLijst.addItem(rs.getString("order"));
                     }
            s.close();
            database.sluitCon();    
        } 
        
        catch (SQLException e) {
            System.out.println("Error: " + e);
        }        
      }


ik heb geprobeerd om in de while-loop dit neer te zetten:
Java:
1
 tfID.setText(rs.getString("id") );
tfID is een hiddenfield
maar ik kreeg toen een error: nullpointerexception.

het was namelijk het idee om die hiddenfield weer uit te lezen en daar een nieuwe query mee te maken...
kan iemand mij op weg helpen hiermee? Ben namelijk geen java expert...

[ Voor 6% gewijzigd door urkelman op 26-05-2005 16:13 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

1) Luister naar actionevents op de combobox mbv een actionlistener
2) komt er een event binnen, kan je op basis van deze informatie het geselecteerde item achterhalen
3) op basis van die item kan je alle info uit de db halen.

Verder denk ik dat er nog heel wat aan je ontwerp gedaan kan worden. Probeer met een Order object te werken die je uit de db haalt. Plaats al deze order objecten in de combobox en ga eventueel met een renderer de juiste info displayen. Op basis van de geselecteerde order kan je dan weer nieuwe info ophalen.
tfID.setText(rs.getString("id") );
Hier kan ik ook niets mee.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:18

Robtimus

me Robtimus no like you

Heb je tfID wel geinitialiseerd ergens? (tfID = new ......).

Verder zou ik niet bij elke wijziging een relatief dure database operatie gaan uitvoeren. Stel je bent lui, en gaat met tab naar je combobox, en dan met de cursors erdoorheen. Dat levert dan flink wat verkeer op.
Beter is om of alles van te voren op te halen en in objecten te stoppen (maar 1x contact met je database, maar wel meteen vrij veel), of om een soort van apply te hebben (alleen database contact als dat nodig is).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
Alarmnummer schreef op donderdag 26 mei 2005 @ 16:22:
1) Luister naar actionevents op de combobox mbv een actionlistener
2) komt er een event binnen, kan je op basis van deze informatie het geselecteerde item achterhalen
3) op basis van die item kan je alle info uit de db halen.

Verder denk ik dat er nog heel wat aan je ontwerp gedaan kan worden. Probeer met een Order object te werken die je uit de db haalt. Plaats al deze order objecten in de combobox en ga eventueel met een renderer de juiste info displayen. Op basis van de geselecteerde order kan je dan weer nieuwe info ophalen.


[...]

Hier kan ik ook niets mee.
ja dat is ook wat het mooiste is, maarja aangezien ik niet zo heel veel verstand daarvan heb wil ik het zo simpel mogelijk houden en het gewoon werkend krijgen!

Ik ga me hoofd even buigen over actionlisteners...

[ Voor 4% gewijzigd door urkelman op 26-05-2005 17:02 ]


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
IceManX schreef op donderdag 26 mei 2005 @ 16:44:
Heb je tfID wel geinitialiseerd ergens? (tfID = new ......).
Ja die heb ik geinitaliseerd... :)

  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
ik krijg het maar niet voor elkaar om het
Java:
1
 `id` van een selectedItem()
te krijgen uit de combobox.
in de while loop laat ik de jcombobox de database uitlezen. dat werkt dus. ik heb geprobeerd om het id daarvan mee te nemen in een variabele, ik heb daarvoor de public void om moeten zetten naar public String.
ik lees de variabele uit in een textfield maar ik krijg 5 te zien. wanneer ik een
Java:
1
system.out.println()
uitvoer zie ik 1/tm 5 staan. hij voert dus die hele loop uit en stopt niet wanneer ik iets geselecteerd heb.

ik heb geprobeerd om er met een actionlistener het id te achterhalen. dmv deze code
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class klantComboBoxHandler implements ActionListener {
        Database database = new Database();
        ResultSet rs = null;
        Statement s;// = database.connection.createStatement();
        
        public void actionPerformed(ActionEvent e){
            try{
                
                database.openCon();
                s = database.connection.createStatement();
                rs = s.executeQuery("SELECT `id` FROM `order` WHERE `order`= '" + cmbKLijst.getSelectedItem().toString() + "'");
                tfID.setText(rs.getString("id"));
                String id = rs.getString("id");
                System.out.println("id?:" + id);
            }
            catch(SQLException sqlException){
                
            }
            if(cmbKLijst.getSelectedItem().equals("Chocolate")){
                
                System.out.println("lekker dan");
            }
        }
}

het zal er wel heel stom uitzien maar ik ben ten einde raad...
kan iemand mij weer op weg helpen

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:18

Robtimus

me Robtimus no like you

getSelectedItem() geeft een Object terug. Die moet je dus eerst terug casten naar de class die je erin hebt gestopt:
Java:
1
((MyClass)cmbKLijst.getSelectedItem()).getID()
MyClass kan natuurlijk ook een standaard Java class zijn zoals String ;)

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
ik heb het volgende gedaan
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class klantComboBoxHandler implements ActionListener {
        Database database = new Database();
        ResultSet rs = null;
        Statement s;// = database.connection.createStatement();
        
        public void actionPerformed(ActionEvent e){
            try{
                
                database.openCon();
                s = database.connection.createStatement();
                String klijst = ((String)cmbKLijst.getSelectedItem());
                rs = s.executeQuery("SELECT `id` FROM `order` WHERE `order`= '" + klijst + "'");
                tfID.setText(rs.getString("id"));
                //String id = rs.getString("id");
                System.out.println("id?:" + id);
            }
            catch(SQLException sqlException){
                
            }
            if(cmbKLijst.getSelectedItem().equals("Chocolate")){
                
                System.out.println("lekker dan");
            }
        }
}


ik krijg geen foutmeldingen, maar je zou zeggen dat hij nu de id naar het textfield id zou moeten sturen....tenminste zo zie ik het, maar dit doet hij dus niet. zie ik iets over het hoofd?

p.s. ik zit me net te bedenken...met die sql query....als er nou meerdere klanten dezelfde naam hebben, dan kun je met deze query natuurlijk nooit meer het id achterhalen |:(

;(

[ Voor 105% gewijzigd door urkelman op 27-05-2005 09:10 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-04 03:55

Nick_S

++?????++ Out of Cheese Error

Je zegt dat je geen foutmeldingen krijgt, maar waar wordt in regel 15 dan het ID vandaan gehaald? Je hebt de regel erboven wel gecommentarieerd, maar de regel eronder niet.

Je gebruikt zo te zien ook geen IDE, deze kan al een hoop fouten (syntactisch) voor je eruit halen.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
het id laat ik wegschrijven door de haalArtikel(); maar omdat die in een while loop staat wordt die telkens overschreden:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public Object haalArtikel(){
        
        Statement s;
        ResultSet rs = null;
        String order;
        String id = null;
        String array[];
        String[] kolomkoppen;
        
        Database database = new Database();
        Object mijnArray[][] = null;
        try {    
            database.openCon();
            s = database.connection.createStatement();
            s.executeQuery("SELECT `id`, `order` FROM `order` "); 
            rs = s.getResultSet();
            //rs.last();
            int arij = rs.getRow();
            
            ResultSetMetaData RSMD=rs.getMetaData();
            int akol =RSMD.getColumnCount();
            String[] kolnamen = new String[akol];
            for(int i=0;i<akol;i++){
                kolnamen[i]=RSMD.getColumnName(i+1);
            }
            kolomkoppen = kolnamen;
            mijnArray = new Object[arij][akol];
           
            int R=0;
            //if (rs != null) 
                while ( rs.next() ) {
                    
                    for(int C=1; C<=akol;C++){
                        //arrays 0-gebaseerd, Resultsets vanaf kolom nr.1
                        //mijnArray[R][C-1]=rs.getObject(C);
                        System.out.println("object C: "+ rs.getObject(C));
                        }
                    R++;
                    
                    order = (""+rs.getObject("id") + rs.getObject("order"));
                    cmbKLijst.addItem(order);
                    
                    
                    System.out.println("object: "+rs.getObject("order")+" "+ rs.getObject("id"));
                    
                    
                     }id = rs.getString("id");
            s.close();
            database.sluitCon();    
        
        }
        catch (SQLException e) {
            System.out.println("Error: " + e);
        }   
        catch (Exception e) {
               System.out.println("Error: " + e);}
        //this.id = id;
        //return  id;
        return mijnArray;
      }
zoals je ziet heb ik de code iets veranderd (t.o.v. de eerste post), ik weet niet of dit ten goede komt maarja....ik ben al tot vanacht half 2 bezig geweest het op te lossen maar zie door de bomen het bos niet meer!

[ Voor 10% gewijzigd door urkelman op 27-05-2005 09:14 ]


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
als ik trouwens de comments voor
Java:
1
mijnArray[R][C-1]=rs.getObject(C);
in de FOR statement weghaal, krijg ik deze foutmelding:

Error: java.lang.ArrayIndexOutOfBoundsException: 1

[ Voor 6% gewijzigd door urkelman op 27-05-2005 10:38 ]


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-04 03:55

Nick_S

++?????++ Out of Cheese Error

Die rs.getRow() die je gebruikt om je array te initializeren, geeft die de RowCount terug of de huidige Row?

Voor RowCount, zul je misschien eerst een count() SQL statement moeten doen. (Ik weet niet of resultSet een RowCount kan aangeven, als je nog niet aan het einde bent (geweest))

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
Nick_S schreef op vrijdag 27 mei 2005 @ 11:45:
Die rs.getRow() die je gebruikt om je array te initializeren, geeft die de RowCount terug of de huidige Row?

Voor RowCount, zul je misschien eerst een count() SQL statement moeten doen. (Ik weet niet of resultSet een RowCount kan aangeven, als je nog niet aan het einde bent (geweest))
aan de code te zien geeft hij de hele inhoud van de tabel `order` weer, ik heb dezelfde code (gezocht op internet naar voorbeelden en kwam deze code tegen) gebruikt om een data te laden in een JTable en daar kreeg ik alles te zien!

Maarja ik heb deze code aangepast (hij extends eerst van een AbstractTableModel) voor de combobox maar waarschijnlijk dus niet juist, ben zoals ik al eerder zei een beginner, maar heb dit nodig voor mijn stage project!
Als ik dus de data in de JComboBox heb moet hij het id wat bij het gekozen item hoort doorgeven aan een query of een hidden textfield waar ik daar weer het idee vandaan kan lezen om zo automatisch mijn formulier te vullen met klantengegevens/artikelgegevens!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:18

Robtimus

me Robtimus no like you

Je roept die getRow() op direct na het opvragen van de ResultSet. Zoals in de doco staat:
Initially the cursor is positioned before the first row.
Dus getRow() levert -1 of 0 op. Je creeert dan een array met 0 elementen - geen wonder dat dat fout gaat.
Die rs.last() zou dat op kunnen lossen, mits je database dat toelaat. Daarna weer met rs.beforeFirst() terug naar het begin zetten natuurlijk.
Als je database deze 2 niet toelaat zul je het echt met een SELECT COUNT(*) moeten oplossen, want er is volgens mij geen andere manier om het aantal rows op te vragen (heb het iig niet kunnen terugvinden).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
het is me eindelijk gelukt, het grootste en stomste probleem was dat ik haalArtikel() meteen bovenaan in mijn constructor had gezet of vlak onder een combobox, als ik dan bijvoorbeeld een settext wilde doen en die textfield stond onder haalArtikel() gaf hij een nullpointerexception, en das natuurlijk logisch want hij bestaat op dat moment niet.

ik heb het nu als volgt opgelost:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public void haalArtikel(){
    
    Statement s;
    ResultSet rs = null;
    Object value = null;
    
    Database database = new Database();
    
    try {
        
        database.openCon();
        s = database.connection.createStatement();
        rs = s.executeQuery("SELECT * FROM `order`"); 
        if (rs != null) 
            while ( rs.next() ) {
                cmbKLijst.addItem(rs.getString("order"));
                
            }
        s.close();
        database.sluitCon();
    } catch (SQLException e) {
        System.out.println("Error: " + e);
    }
    
    
    
}


class ArtikelListener implements ItemListener{
    
        public void itemStateChanged(ItemEvent event){
            if(event.getStateChange() == ItemEvent.SELECTED){
                int id = cmbKLijst.getSelectedIndex()+1;
                tfID.setText(""+id);}
            
            }
        
    }
}


en ik heb haalArtikel() helemaal onderaan mijn constructor gezet. ik krijg nu het id dat bij de geselecteerde item hoort uit de combobox, ik zet dit veld nu invisible en lees het veld uit om de rest van de gegevens op te zoeken en die te plaatsen in de textfields!!

iig hartstikke bedankt voor al jullie moeite!!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19:18

Robtimus

me Robtimus no like you

Waarom trouwens een invisible control nemen om een waarde in op te slaan? Neem gewoon een private String variable.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • urkelman
  • Registratie: December 2003
  • Laatst online: 29-04 08:49
IceManX schreef op zondag 29 mei 2005 @ 17:09:
Waarom trouwens een invisible control nemen om een waarde in op te slaan? Neem gewoon een private String variable.
dat bedacht ik me net ook ja, extra werk op niks af :D
Pagina: 1