Toon posts:

[Java] JButton/Action probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste tweakers,

Ik ben bezig een simpele GUI uit te werken, maar kom een raar probleem tegen waarvan ik zo 1 2 3 niet weet hoe het ontstaat en hoe ik het weg kan werken.
Java:
1
2
3
4
5
6
7
public void actionPerformed(ActionEvent e) {
    
        if(e.getActionCommand().equals("Cancel")) { 
        
            invoerVeldAction("Cancel");
        }
}

Vanuit deze method wordt de volgende code aangeroepen:
Java:
1
2
3
4
public void invoerVeldAction(String input) {
if (input.equals("Cancel")) {
            invoerTextField.setText("");
        }

Het vervelende is dat wanneer ik op de cancel knop druk het textfield niet leeg gemaakt wordt, maar er Cancel in komt te staan, terwijl imho invoerTextField.setText(""); moet zorgen voor een blanco textfield.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Zijn er nog meer actionListeners die misschien per ongeluk aangeroepen worden?

Je hoeft dat leegmaken van je textfield trouwens niet in een aparte methode te zetten :)
Als het toch maar een regel code is dan lijkt het mij netter om hem gewoon in de actionperformed te zetten.
Maar dat terzijde ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 11:27
Dat met settext zou idd gewoon moeten werken. Mischien dat er een cleartext functie is die je kan gebruiken?

Verwijderd

heb je voor je Button wel de action command op "Cancel" gezet? Als je dat vergeet, wordt de "Cancel" string nooit verstuurd.

Verder vind ik het niet zo netjes dat je telkens de string "Cancel" herhaalt. Het is naar mijn mening netter als je hiervoor een constante gebruikt. Dit voorkomt problemen als je een keer een tiepvoud maakt...

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Ik denk niet dat we met zo weinig info jou kunnen helpen. Post eens wat meer code. Bijvoorbeeld de code waar je de actionlistener toevoegt aan de button en waar je de button initialiseert.
Heb je nog meer actionPerformed methoden? Je zegt dat de tekst veranderd in "Cancel", wat erop kan duiden dat je nog ergens een actionPerformed hebt waar dit gedaan wordt.

Verwijderd

Topicstarter
Ik heb inmiddels een simpele oplossing ingebouwd,
Java:
1
2
3
4
if (input.equals("Cancel")) {
            invoerTextField.setText("");
            return;
        }


Nu werkt het wel zoals het hoort.

Warm weer >.<

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Verwijderd schreef op maandag 12 juni 2006 @ 15:12:
Ik heb inmiddels een simpele oplossing ingebouwd,
Java:
1
2
3
4
if (input.equals("Cancel")) {
            invoerTextField.setText("");
            return;
        }


Nu werkt het wel zoals het hoort.

Warm weer >.<
Dan denk ik dat je code bagger is.
Als je in een void functie zomaar return nodig hebt doe je iets verkeerd qua structuur :)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
Oh het is echt een verschrikkelijke bende, maar dit stuk is vooral om even een beetje wegwijs te worden met actionlisteners etc.

Later deze week als alles wat meer vertrouwd aanvoelt gaat de code op het schop om er een meer gestructureerde bak met spaghetti van te maken ;p

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Verwijderd schreef op maandag 12 juni 2006 @ 15:18:
Oh het is echt een verschrikkelijke bende, maar dit stuk is vooral om even een beetje wegwijs te worden met actionlisteners etc.

Later deze week als alles wat meer vertrouwd aanvoelt gaat de code op het schop om er een meer gestructureerde bak met spaghetti van te maken ;p
Ik denk dat als je je volledige invoerVeldAction laat zien dat er ergens nog iets staat als:
invoerTextField.setText("Cancel");
of
invoerTextField.setText(input);

Je doet een return, dat betekent dat je de methode verlaat. Aangezien je code dan niet meer op Cancel wordt gezet betekent dat, dat er verderop in de invoerVeldAction methode het textveld op Cancel wordt gezet.

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
The Fox NL schreef op maandag 12 juni 2006 @ 15:32:
[...]


Ik denk dat als je je volledige invoerVeldAction laat zien dat er ergens nog iets staat als:
invoerTextField.setText("Cancel");
of
invoerTextField.setText(input);

Je doet een return, dat betekent dat je de methode verlaat. Aangezien je code dan niet meer op Cancel wordt gezet betekent dat, dat er verderop in de invoerVeldAction methode het textveld op Cancel wordt gezet.
Vosje heeft gelijk ;)

Post eens die hele functie?
Ik vondhet al vreemd dat er steeds een sluit-accolade miste ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Ik gok ongeveer op deze constructie:
Java:
1
2
3
4
5
6
7
8
if (input.equals("Cancel")) {
    invoerTextField.setText("");
}
if (input.equals("OK")) {
    invoerTextField.setText("OK");
} else {
    invoerTextField.setText(input);
}


Een else na de eerste accolode sluiten (regel 3) wil dan wel helpen

Verwijderd

Topicstarter
Oké maar wees gewaarschuwd hehe
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
61
62
63
64
65
66
67
68
// wanneer een button ingedrukt wordt, zal deze method aangeroepen worden
    public void actionPerformed(ActionEvent e) {
        
        // test welke button er ingedrukt wordt
        // een buttons actioncommand property is hetzelde als de caption
        // van de button
        if(e.getActionCommand().equals("1")) { 
        
            invoerVeldAction("1");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("2")) { 
        
            invoerVeldAction("2");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("3")) { 
        
            invoerVeldAction("3");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("4")) { 
        
            invoerVeldAction("4");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("5")) { 
        
            invoerVeldAction("5");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("6")) { 
        
            invoerVeldAction("6");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("7")) { 
        
            invoerVeldAction("7");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("8")) { 
        
            invoerVeldAction("8");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("9")) { 
        
            invoerVeldAction("9");
            //statusBeschrijvingLabel.setText("BLA: button1");
        }
        if(e.getActionCommand().equals("0")) { 
        
            invoerVeldAction("0");
            //statusBeschrijvingLabel.setText("BLA: 0");
        }
        if(e.getActionCommand().equals("OK")) { 
        
            invoerVeldAction("OK");
            
        }
        if(e.getActionCommand().equals("Cancel")) { 
        
            invoerVeldAction("Cancel");
            
            
        }
    }


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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
public void invoerVeldAction(String input) {
        String codeInBewerking = null;
        
        // belangrijk++!!
        // deze moet naar in gecast worden
        // want er wordt mee gerekend
        
        String bedragInBewerking = null;
        
        if (input.equals("Cancel")) {
            invoerTextField.setText("");
            return;
        }
        
        if (input.equals("OK")) {
            if(!pinIngevoerd) {
                statusBeschrijvingLabel.setText("Pincode nog niet ingevoerd");
                return;
            } else { 
                invoerLabel.setText("Bedrag: ");
                invoerTextField.setText("");
                
                bedragInBewerking = invoerTextField.getText();
                invoerTextField.setText(bedragInBewerking + input);
            
                if(bedragInBewerking.length() == 3) {
                
                    opnameBedrag = Integer.parseInt(invoerTextField.getText());
                
                    // kan variabel zijn...
                    if (opnameBedrag > 1000) {
                        statusBeschrijvingLabel.setText("Maximaal is 1000, bedrag aangepast");
                        invoerTextField.setText("1000");
                    }
                    if (Integer.parseInt(bankId) == myBankID) {
                        statusBeschrijvingLabel.setText("Eigenbank methode aanroepen");
                        
                        // oke hier motteh we nog maar wat op verzinenn
                        // heh
                        //makeOwnXML();
                    } else {
                        statusBeschrijvingLabel.setText("Interpay");
                        // hulde aan erik
                        makeInterpayXML();
                    }
                
                    /*
                     *XML FILE GENEREREN
                     *
                     */ 
                }
                
                return;
            }
        }
        
        
        
        
        // als de pin niet gevalideerd is 
        // kunnen we er vanuit gaan dat deze 
        // nog ingetoets moet worden
        if(!pinIngevoerd) {
            codeInBewerking = invoerTextField.getText();
            invoerTextField.setText(codeInBewerking + input);
            if(codeInBewerking.length() == 3) {
                
                String pCode = invoerTextField.getText();
                pinCode = Integer.parseInt(invoerTextField.getText());
                
                
                statusBeschrijvingLabel.setText("Ingevoerde pincode: "+ pinCode);
                pinIngevoerd = true;
                
            
            }
            return;
        } 
        if(pinIngevoerd) {
        
            bedragInBewerking = invoerTextField.getText();
            invoerTextField.setText(bedragInBewerking + input);
            
            if(bedragInBewerking.length() == 3) {
                
                opnameBedrag = Integer.parseInt(invoerTextField.getText());
                
                // kan variabel zijn...
                if (opnameBedrag > 1000) {
                    statusBeschrijvingLabel.setText("Maximaal is 1000, bedrag aangepast");
                    invoerTextField.setText("1000");
                }
                
                
                /*
                 *XML FILE GENEREREN
                 *
                 */ 
            }
            return;
        } 
    }

Let wel op, de bovenstaande functie ben ik nu aan bezig en het is een enorme zooi, het wordt langzaamaan nog meer zooi. Waarschijnlijk is er voor het opsommen van de fouten en dergelijke nog een compleet subforum met nieuwe database nodig, maar zoals ik al heb gezegd, zodra ik dit WIPje af heb ga ik het herschruiven en er warempel structuur in aanbrengen hehe 8)7

  • Gonadan
  • Registratie: Februari 2004
  • Nu online

Gonadan

Admin Beeld & Geluid, Harde Waren
Vosje, bijna in een keer goed. ;)

@TS
Je moet inderdaad even goed kijken naar het nesten van je if-statements.
Als ik jou was zou ik nu al opnieuw beginnen en het meteen goed structureren.
Anders blijf je tegen dit soort problemen aan lopen :)

Java:
1
2
3
4
    if(!pinIngevoerd) {
            codeInBewerking = invoerTextField.getText();
            invoerTextField.setText(codeInBewerking + input); 
...

Daar gaat het mis.
Die wordt ook gewoon uitgevoerd, terwijl dat niet je bedoeling was neem ik aan :)

[ Voor 36% gewijzigd door Gonadan op 12-06-2006 16:13 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Verwijderd

Topicstarter
Als ik jou was zou ik nu al opnieuw beginnen en het meteen goed structureren.
Ja, inderdaad, na het lezen van mijn post dacht ik waar ben ik eigenlijk mee bezig, dit schiet niet echt op hehe.

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:05
Oef, dit kan inderdaad een stuk efficiënter :P.

Java:
1
2
3
public void actionPerformed(ActionEvent e) {
    invoerVeldAction(e.getActionCommand());
}


En ik zou inderdaad zorgen dat je eerst duidelijk je structuur in orde krijgt. Probeer eens wat te werken met PSD's, dan begin je met programma's te ontwérpen in plaats van direct te schrijven :).

Ik zie ook:
Java:
1
2
3
4
5
6
if (input.equals("Cancel")) {
(...)
}
if (input.equals("OK")) {
(...)
}
Als je daar else if van maakt:
Java:
1
2
3
4
5
6
if (input.equals("Cancel")) {
(...)
}
else if (input.equals("OK")) {
(...)
}
Dan wordt je code ook wat sneller. Jij weet dat er maar één knop tegelijk ingedrukt kan worden, maar het programma doet gewoon wat jij zegt. Zelfs als de Cancel knop is ingedrukt, wordt die andere if (met 'OK') ook nog geevalueerd (kost je weer een paar cyclussen omdat eerst weer die equals("OK") wordt uitgevoerd) en tot slot moet er een sprong gedaan worden over de code binnen de if. Met zulke optimalisaties maak je je programma een stuk sneller.

[ Voor 50% gewijzigd door Jaap-Jan op 12-06-2006 19:34 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Jeldert
  • Registratie: Juni 2001
  • Niet online

Jeldert

Rozijntjes

Volgens mij is je computer echt wel snel genoeg dat je die paar if's echt niet merkt.

Je zou het alsnog met else if moeten doen, dit om fouten te voorkomen. Het is ook logischer: waarom doorgaan met vergelijken als je eigenlijk al klaar bent?

Juist


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 14-02 22:37
Gonadan schreef op maandag 12 juni 2006 @ 16:12:
Vosje, bijna in een keer goed. ;)
Kwestie van fingerspitzengefuhl, yin yan :P

@Worteltaart: Ik zou ook de bovenstaande adviezen volgen, en je code dus meer structureren. returns gebruiken in een void methode is gewoon smerig (hoewel ik het ook wel eens heb gebruikt ;)).
Jeldert schreef op maandag 12 juni 2006 @ 19:59:
Volgens mij is je computer echt wel snel genoeg dat je die paar if's echt niet merkt.

Je zou het alsnog met else if moeten doen, dit om fouten te voorkomen. Het is ook logischer: waarom doorgaan met vergelijken als je eigenlijk al klaar bent?
De huidige computers zijn idd snel genoeg voor deze code, maar dat moet geen reden zijn om je programma niet te optimaliseren. Daarbij komt dat er hier in dit stukje code geen zware dingen zitten. Maar in andere programma's zouden wel eens onnodig zware method calls (sql queries bijvoorbeeld) aangeroepen kunnen worden die eenvoudig te mijden zijn als je structuur goed in elkaar zit.
Pagina: 1