Toon posts:

[Java] Hoe 'painten' vanuit een action?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

Ik ben bezig met een Java opdracht waarbij ik in een tekstvak een waarde (in pixels) kan opgeven waarna er een cirkel wordt getekend. Ook zijn er 2 buttons waarmee ik de cirkel groter en kleiner moet kunnen maken.
Op zich is dit allemaal geen probleem, maar ik moet nu ook 3 extra buttons toevoegen: één waarmee je een gevulde cirkel kunt maken, één waarmee je de kleur van de cirkel in rood kunt veranderen en één waarmee je de kleur van de cirkel in geel kunt veranderen.
Ik begrijp dat ik in een action niet opnieuw paint(Graphics g) kan oproepen, maar ik begrijp niet hoe ik dit dan wel moet doen.
Ik heb tot nu toe de volgende 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
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
103
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Bla extends Applet {
    String invoer;
    int straal;
    TextField invoerVak;
    Label invoerLabel;
    Button tekenCirkel, vergrootCirkel, verkleinCirkel, vulCirkel, kleurRood, kleurGeel;
    
    public void init() {
        straal = 0;
        
        invoerLabel = new Label("Straal:");
        
        invoerVak = new TextField(4);
        
        tekenCirkel = new Button("Tekenen");
        tekenCirkel.addActionListener(new tekenCirkelHandler());
        
        vergrootCirkel = new Button("Vergroten");
        vergrootCirkel.addActionListener(new vergrootCirkelHandler());
        
        verkleinCirkel = new Button("Verkleinen");
        verkleinCirkel.addActionListener(new verkleinCirkelHandler());
        
        vulCirkel = new Button("Opvullen");
        vulCirkel.addActionListener(new vulCirkelHandler());
        
        kleurRood = new Button("Rood");
        kleurRood.setBackground(Color.red);
        kleurRood.addActionListener(new kleurRoodHandler());
        
        kleurGeel = new Button("Geel");
        kleurGeel.setBackground(Color.yellow);
        kleurGeel.addActionListener(new kleurGeelHandler());
        
        add(invoerLabel);
        add(invoerVak);
        add(tekenCirkel);
        add(vergrootCirkel);
        add(verkleinCirkel);
        add(vulCirkel);
        add(kleurRood);
        add(kleurGeel);
    }
    
    public void paint(Graphics g) {
        g.drawOval(20, 50, straal, straal);
    }

    class tekenCirkelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            invoer = invoerVak.getText();
            straal = Integer.parseInt(invoer);
            invoerVak.setText("");
            repaint();
        }
        
    }
    
    class verkleinCirkelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            straal -= 20;
            repaint();
        }
        
    }
    
    class vergrootCirkelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            straal += 20;
            repaint();
        }
        
    }
    
    class vulCirkelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            /* g.fillOval(20, 50, straal, straal); */
            repaint();
        }
        
    }
    
    class kleurRoodHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            /* ? */
            repaint();
        }
        
    }
    
    class kleurGeelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            /* ? */
            repaint();
        }
        
    }
    
}


Iemand die mij misschien een aanzet kan geven? :)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

het gebruik van anonieme klassen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
class OmHetEven {
    private boolean opgevuld = false;
    private JButton knop;
    OmHetEven()
    {
        knop = new JButton("Toggle Opgevuld");
        knop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                opgevuld = !opgevuld;
            }
        }
    }
}

is een mogelijkheid

of eigen luisterklassen
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class OmHetEven
{
    protected boolean opgevuld = false;
    paint(Graphics g) {
        if (opgevuld)
            //
        else
           //
    }
}

class OmHetEvenActionListener implements ActionListener
{
    OmHetEvenActionListener(OmHetEven ohe) { //... }
    public void actionPërformed(ActionEvent e) { //.. }
}


beide implementaties vind ik mooier dan de geneste klassen die jij gebruikt.

[ Voor 42% gewijzigd door H!GHGuY op 10-04-2005 18:18 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Wel mooier idd, maar omdat we nog bezig zijn met de basis van Java kan ik daar nooit mee aankomen bij m'n leraar. ;)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

tip:
steek alles wat getekend moet worden in je paint functie. (en zie mijn 2de voorbeeld)

[ Voor 19% gewijzigd door H!GHGuY op 10-04-2005 21:14 ]

ASSUME makes an ASS out of U and ME


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Het wordt dus:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Bla extends Applet {
    String invoer;
    //...

    boolean opgevuld;

    paint(Graphics g) {
        if (opgevuld)
            //
        else
           //
    }

    class vulCirkelHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            opgevuld = true;
            repaint();
        }
        
    }
} 


Er wordt gebruik gemaakt van het Model-View-Controller (MVC) patroon. De Controller (Actionlistener) verandert je Model (fields) en zegt dat de View opnieuw moet tekenen. De View gebruikt de data uit het Model.

Zo programmeren helpt fouten te voorkomen. Het komt in software vaak voor dat de volgorde van knopjes aanklikken uitmaakt voor het gedrag van een form. Dit soort problemen zijn onmogelijk als je MVC gebruikt.

Concrete voorbeelden waar MVC niet is gebruikt:
- In Office 2000 als ik plaatje van scanner of camera wil halen dan staat in het venster de scanner geselecteerd, maar als ik ophalen klik dan start de twain-driver van de camera. Wil ik de scanner hebben dan moet ik de combobox even bewerken.
- In Windows 2000 als ik bij de permissions van bestanden de "deny-all" aanzet en ik klik vanaf onderen alles uit, dan verdwijnt het vinkje bij "deny-modify". Als ik dan OK klik kan ik het bestand niet meer wijzigen, maar volgens het permissions-venster mag alles.