Missa inte Amazon Prime Day i Dagens fynd

Varför ritas två cirklar? (Programmering 1)

Permalänk

Varför ritas två cirklar? (Programmering 1)

Försöker göra en uppgift till Programmering 1. När programmet körs så ska 5 cirklar ritas (random färg, storlek och placering). Tänkte att jag försöker mig på att rita en cirkel först...men det blir två! Varför? Känns ju som det är något i koden som ska "bort", men vad? Ursäkta svengelskan i kommentarerna.

Mycket tacksam för hjälp.

Här är min kod:

import java.awt.Graphics; import java.awt.Color; import javax.swing.JFrame; import java.util.Random; public class Rita extends JFrame { public Rita() { setTitle("Rita"); setSize(960, 960); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void paint(Graphics g) { // Initierar ett random object Random rand = new Random(); // loop to draw cicles //for (int i = 0; i<5; i++); //Initierar random color int red = rand.nextInt(256); int green = rand.nextInt(256); int blue = rand.nextInt(256); Color randomColor = new Color (red, green, blue); // Generate random circle width 50 and X pixels int width = rand.nextInt(201) + 20; // Generate random X/Y koordinater int radius = (int)(Math.random()*49) + 2; int x = (int)(Math.random()*(960-radius*2) + radius); int y = (int)(Math.random()*(960-radius*2) + radius); //int x = rand.nextInt(960); //int y = rand.nextInt(960); // set the color g.setColor(randomColor); // Draw the circle g.fillOval(x, y, width, width); // aka rita oval, storlek } public static void main(String[] args) { Rita rita= new Rita(); rita.paint(null); } }

Permalänk
Medlem

paint-metoden för din JFrame anropas automatiskt när fönstret behöver ritas om, så ditt anrop till rita.paint i main är onödigt. Det är dessutom fel att anropa paint med null som argument som du gör, så du borde få ett NullPointerException när du gör så.

Permalänk
Skrivet av perost:

paint-metoden för din JFrame anropas automatiskt när fönstret behöver ritas om, så ditt anrop till rita.paint i main är onödigt. Det är dessutom fel att anropa paint med null som argument som du gör, så du borde få ett NullPointerException när du gör så.

Tack för svar. Jag har tagit bort rita.paint, men låter Rita rita= new Rita(); ligga kvar. Verkar inte gå att köra programmet utan att ha något i main. Blir fortfarande två cirklar.

Inser också att jag borde lägga rita-grejen i en panel. JFrame är tydligen inte till för att rita i (om det nu spelar någon roll).

Permalänk
Medlem

Ser flera saker men då jag inte programmerar i Java så är det bara ett par saker jag reagerar på:
Din for loop inehåller ingen kod den avslutas direkt med ;
Troligtvis kommer du från python men indentering gör ingenting i C baserade språk och troligtvis inte Java heller, du vill omringa din indenterade kod med {} precis som hela funktionen.

Tycker även att i en klass med main() att instansiera sig själv ser väldigt konstigt ut. Att paint körs med NULL när den bör kräva ett Graphics objekt för att fungera.

Permalänk
Medlem
Skrivet av reklamish:

Tack för svar. Jag har tagit bort rita.paint, men låter Rita rita= new Rita(); ligga kvar. Verkar inte gå att köra programmet utan att ha något i main. Blir fortfarande två cirklar.

Jag gissar att paint kanske anropas när fönstret skapas, och sen ytterligare en gång när du kör setSize på det för att ändra storlek. Eftersom du aldrig tömmer ritytan så blir allt du ritat tidigare kvar, så om du t.ex. ändrar storlek på fönstret manuellt så bör du se att ytan fylls av cirklar.

Problemet verkar vara att du inte anropar super.paint(g) i början av din paint-metod, så basmetoden från JFrame körs aldrig och tömmer ritytan. Men det verkar inte vara rekommenderat att överlagra paint utan man bör istället använda paintComponent (se dokumentation). Och då bör du som du är inne på använda t.ex. en panel istället.

Permalänk
Medlem

Kan inte svara på varför du får två cirklar, men eftersom du inte har kontroll över när paint kallas vore det kanske bättre att lägga slumpgenereringskoden utanför paint-metoden. Det skulle göra att paint ritar om samma cirklar ifall den bestämmer sig för att det är dags att måla om.

Låt paint bestämma hur det ska ritas, inte vad som ska ritas