Toon posts:

Java - Graphics g gebruiken in andere klasse

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik moet voor school een opdracht maken. Het doel is dat er in het begin één ovaal (ei) wordt getekend met een streep in het midden. Er is één textbox aanwezig en twee buttons. In de textbox kan je een kleur invullen (rood, groen, blauw en geel zijn valide inputs). Als je op de knop 'teken' drukt, dan tekent hij een tweede(of derde of vierde) ei naast het huidige ei met de kleur die in de textbox werd gezet. Verder moet je de eieren op en neer kunnen laten bewegen met de knop 'beweeg'.

Nou goed, ik heb 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
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author School
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class Paneel extends JPanel {
    
    
    private JButton tekenknop, beweegknop;
    private JTextField txt1;
    private int xpositie;
    private int ypositie = 100;
    private int rectpositie = 180;
    
    public Paneel(){
        setBackground(Color.WHITE);
        
        txt1 = new JTextField(10);
        
        tekenknop = new JButton("Teken");
        tekenknop.addActionListener(new tekenknopHandler());
        
        beweegknop = new JButton("Beweeg");
        beweegknop.addActionListener(new beweegknopHandler());
        
    }
    
    public void paintComponent(Graphics g){
        
        super.paintComponent(g);
        g.setColor(Color.GRAY);
        g.fillOval(xpositie, ypositie, 150, 220);
        g.setColor(Color.YELLOW);
        g.fillRect(xpositie, rectpositie, 150, 50);
    }
    
    class tekenknopHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            ypositie = ypositie + 200;
            String y = txt1.getText();
            String input = y.toLowerCase();
            if (input.equals("rood"))
            {
            g.setColor(Color.RED);
            g.fillOval(xpositie, ypositie, 150, 220);
            g.setColor(Color.YELLOW);
            g.fillRect(xpositie, rectpositie, 150, 50);
            
            
            }
        }
        
    }
    
    class beweegknopHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            
            
        }
        
    }
    
    
}


Maar ik kan de ovaal niet laten drawen door g aan te roepen in de klasse tekenknopHandler. Als ik de accolades aanpas zodat die klasse binnenin de paintComponent klasse valt, krijg ik weer een error bij het plaatsen van de button.

Iemand enig idee wat ik kan doen?

[ Voor 0% gewijzigd door BtM909 op 25-03-2015 14:33 ]


Acties:
  • 0 Henk 'm!

  • hostler
  • Registratie: Juni 2009
  • Laatst online: 13-09 16:56

hostler

Yeahhh dude!

Is het niet de bedoeling dat je de schoolopdracht zelf maakt? :P

Moet je niet drawOval toevoegen?

Ff snel gekopieerd van een oude opdracht:

code:
1
2
3
4
5
6
7
8
9
10
int x = 0;
int y = 50;
int afm = 20;

g.setColor(Color.red);
g.fillOval(x, y, afm, afm);
g.setColor(Color.black);
g.drawOval(x, y, afm, afm);

x += afm;

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat klopt, maar mijn leraar kan niets voor me betekenen vreemd genoeg. :P De code die je post is om je ovaal groter te maken als ik het goed lees. DrawOval is om een ovaal te tekenen zonder opvulling (alleen de randen dus). Wat ik probeer is om een gevulde ovaal te tekenen vanuit een andere klasse.

[ Voor 16% gewijzigd door Verwijderd op 25-03-2015 14:45 ]


Acties:
  • 0 Henk 'm!

  • xrgman
  • Registratie: Oktober 2012
  • Laatst online: 09-10 23:01
Maak een methode aan in deze klasse die als parameter een Graphics object neemt, vervolgens roep je deze methode aan in de paintcomponent en geef je je Graphics object g door als paramater.

Acties:
  • 0 Henk 'm!

  • hostler
  • Registratie: Juni 2009
  • Laatst online: 13-09 16:56

hostler

Yeahhh dude!

Verwijderd schreef op woensdag 25 maart 2015 @ 14:43:
Dat klopt, maar mijn leraar kan niets voor me betekenen vreemd genoeg. :P De code die je post is om je ovaal groter te maken als ik het goed lees. DrawOval is om een ovaal te tekenen zonder opvulling (alleen de randen dus). Wat ik probeer is om een gevulde ovaal te tekenen vanuit een andere klasse.
Mijn Java is een beetje roestig :P

Acties:
  • 0 Henk 'm!

  • Jurgle
  • Registratie: Februari 2003
  • Laatst online: 24-06 00:27

Jurgle

100% Compatible

Tip: dependency injection

Dit kun je zover doorvoeren als je wilt, maar in jouw geval is iets als het volgende voldoende:

Je voegt aan de constructor van tekenknopHandler een parameter toe van het type Paneel, deze sla je als (private) member van tekenknopHandler op (bijvoorbeeld in 'private Paneel _paneel)'.

Op regel 32 van je code geef je dat Paneel mee door "new TekenknopHandler( this )".

In je tekenknopHandler wijzig je de actionperformed zodanig dat je de benodigde informatie uit het event haalt dat je binnenkrijgt en dat paas je door aan _paneel.nieuweMethodeDieOpZijnBeurtTekentOpG( _nuttigeInformatieUitEvent ).

Op die manier hoeft je tekenknopHandler zich alleen maar bezig te houden met wat zijn naam impliceert en delegeert het de tekenwerkzaamheden naar degene die zich daarmee bezig moet houden.

Ben ik duidelijk genoeg?

My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

zodat die klasse binnenin de paintComponent klasse
Misschien is dit slechts een verspreking, maar paintComponent is een methode en geen klasse. Mocht dit geen verspreking zijn, zoek dan goed uit wat het verschil tussen die twee is, want als je dat niet weet ga je tegen heel veel problemen aanlopen. ;)

Overigens weet ik niet of dit het nodeloos gecompliceerd maakt, maar enkel iets erbij tekenen als je op een knop drukt is niet hoe getekend programma normaal in elkaar zit. Als je nu het venster resized/minimaliseert, dan verwijnt alles wat je hebt getekend. Eigenlijk hoort paintComponent de hele situatie te tekenen (inclusief eieren die eerder al binnengekomen zijn). Met die opzet zou het programma dus het aantal eieren onthouden (of een lijstje van losse eieren, als je hier nog meer informatie over op wil slaan) en zou paintComponent alle eieren tekenen. De tekenknopHandler zou dan alleen een ei toevoegen, en omdat de situatie veranderd is een repaint() aanroepen (die zorgt dat het opnieuw getekend wordt, d.m.v. paintComponent).

Mocht je dan het scherm resizen, dan wordt automatisch drawComponent aangeroepen en komen al je eieren weer tevoorschijn.

Heeft geen speciale krachten en is daar erg boos over.


Acties:
  • 0 Henk 'm!

  • New
  • Registratie: Februari 2001
  • Laatst online: 10-10 08:10

New

Ik zou een "Ei" klasse maken, hierin de kleuren en positie bijhouden.

In de klasse Paneel maak je een ArrayList<Ei> en een methode waarmee je een Ei kunt toevoegen aan de lijst. Daarin houd je de eieren bij tot je ze kunt tekenen.

Vervolgens laat je de actionPerformed methodes objecten van die klasse aanmaken en voeg je ze toe aan de ArrayList door eerder genoemde methode aan te roepen op Paneel.

Ten slotte teken je alle eieren in de ArrayList in de paintComponent methode. Je kunt een redraw afdwingen door repaint aan te roepen op het paneel. Hoe je de verbinding tussen je ActionListener en het Paneel maakt houden we even geheimzinnig. Het moet wel leerzaam blijven natuurlijk ;).
Pagina: 1