Archief - [PROG][JAVA] probleem met scrollpane

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

VenomGameworld

Legacy Member
Hey,

Voor een taak voor school ben ik bezig met een AWT applet. Het is de bedoeling in een Canvas figuren te genereren dus deze kan vrij groot worden. Vandaar dat hij in een ScrollPane zit. Het probleem is echter, wanneer ik schuif met de schuifbalken, de repaint() opnieuw wordt opgeroepen en alles er redelijk fucked up uitziet.

Dit is de code van de hoofdklasse van de applet (lay-out: MVC)
Code:
public void init() {
        
        setSize(430,450);
        setLayout(new GridLayout(2,1));
        
        tekenvel = new Tekengebied();
        paneelKeuzes = new Controller(tekenvel);
        add(paneelKeuzes);
        
        scrollpane = new ScrollPane();
        scrollpane.add(tekenvel);
        add(scrollpane);
           
    }

Dit is de paint-methode van de Canvas Tekengebied:
Code:
public void paint(Graphics g) {
        
        //Zodat er niet meteen bij het opstarten wordt getekend
        if(tekenen) {
            
            //Aantal items in de kleur-array
            lengte = kleur.length;
            
            //Teller die we zullen doorlopen om een kleur uit de geselecteerde
            //kleuren te kiezen
            teller = 0;
            
            for(int i = 0;i < aantal;i++) {
                
                //Willekeurige waarde voor X tussen 1 en 800
                random = (int)(801 * Math.random() + 1);
                x = random;
                
                //Willekeurige waarde voor Y tussen 1 en 600
                random = (int)(601 * Math.random() + 1);
                y = random;
                
                //Index van een geselecteerde kleur opvragen via array
                kleuren = kleur[teller];
                
                //We laten de teller altijd tellen van 0 tot de de max van de array
                //Als we de max bereiken, zettem we hem terug op 0
                //en beginnen we opnieuw
                if(teller == (lengte - 1)) {
                    teller = 0;
                } else {
                    teller++;
                }
                
                //Integer "kleuren" gebruiken als index voor de array met de kleuren
                //en de kleur als actieve kleur zetten
                g.setColor((Color)(kleurRij[kleuren]));
                
                if(vorm == "cirkel") {
                    g.fillOval(x,y,formaat,formaat);
                } else {
                    g.fillRect(x,y,formaat,formaat);
                }
                
            }
            
        }
        
        
    }

Zoals je ziet, werk ik hier met willekeurige waardes. Ik zou bijgevolgd niet graag de event in 2 opsplitsen om te zien welke repaint() er is opgeroepen (die van het setten van de boolean tekenen of die van de schuifbalk).
Is er geen efficiënte manier om dit op te lossen?
Bij voorbaat dank!

Bavo aka Joske

Legacy Member
Er zijn veel fouten merkbaar, even de opvallandeste:

paint(Graphics g) uit Component is de methode die de visuele weergave tekent van u component. Jij hebt gekozen dat te overriden om uw eigen tekening te maken. Fijn, zorg er dan wel voor dat dit in dezelfde omstandigheden dezelfde is.
Bepaal je random waarden op voorhand erbuiten, en gebruik die binnen die methode. Zo wordt er bij repaint (en dat gebeurt heel vaak) hetzelfde getekend.

if(vorm == "cirkel") werkt enkel als je sjans hebt. De correcte versie is if (vorm.equals("cirkel"))
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan