webForumDet fria alternativet

Lite problem med JFrame och få in drawRect...

17 svar · 1 261 visningar · startad av Asa

AsaMedlem sedan dec. 20011 860 inlägg
#1

Jag håller på med en grej som ska slumpa fram siffror mellan 1 och 6 och dessa ska nu skrivas ut så här:

1 9 HISTOGRAMSTAPEL HÄR
2 11 HISTOGRAMSTAPEL HÄR
3 10 HISTOGRAMSTAPEL HÄR
4 8 HISTOGRAMSTAPEL HÄR
5 11 HISTOGRAMSTAPEL HÄR
6 11 HISTOGRAMSTAPEL HÄR

Vill försöka sätta ram runt siffrorna jag har i andra kolumnen med siffror och sen rita ut min stapel. Nån som kan hjälpa mig? Gärna förbättringar i koden men dock inte för mycket så jag inte fattar. Gärna att ni kommenterar om ni skrivit in eller ändrat något tack.

Koden här för filerna

TheDice.java

package javaprylar;

public class TheDice {    
    public static void main(String[]args)
    {
        TarningsTabell tar = new TarningsTabell();
    }    
}

TarningsTabell.java

package javaprylar;

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

public class TarningsTabell extends JFrame
{

    Random slump = new Random();
    int slumpatTal;
    int totAntalKast;
    private static int[] kast = new int[6];
                
    public TarningsTabell() {
        totAntalKast = 60;
        genereraSlumpTalsTabell();
        genereraJframe();
    }
    
    public TarningsTabell(int totAntalKast) {
        this.totAntalKast = totAntalKast;
        genereraSlumpTalsTabell();
        genereraJframe();
    }
    
    public void genereraJframe(){
        this.setLayout(new FlowLayout());
        this.setSize(300,300);
        this.setTitle("Tärning");
        this.setResizable(false);
        this.setLocation(400,250);
        this.getContentPane().setBackground(Color.WHITE);
        
        JPanel ytan = new JPanel();
        
        for (int i = 0; i < kast.length; i++){
            //Stapel grafikpanel = new Stapel(totAntalKast,kast[i]);        
            JLabel text1 = new JLabel("" + (i + 1) + " ");
            JLabel text2 = new JLabel("" + kast[i] + " ");
            JLabel text3 = new JLabel("Stapeln skall vara här");
            
            text1.setPreferredSize(new Dimension(15,20));
            text2.setPreferredSize(new Dimension(25,20));
            text3.setPreferredSize(new Dimension(235,20));
            this.add(text1);this.add(text2);this.add(text3);
            //this.add(grafikpanel);
        }
        
        this.setVisible(true);
    }
    
    public void genereraSlumpTalsTabell(){   
        for (int i = 0; i < totAntalKast; i++){
            slumpatTal = slump.nextInt(6);
            kast[slumpatTal]++;
        } 
        for (int i = 0; i < kast.length; i++){
            System.out.println(i + 1 + " - " + (kast[i]) );
        } 
    }
    
    // Använder ju inte jag...
    public int[] getKast(){      
        return kast;
    }
}

Sen skapa jag en till för ev Histogramstapel för jag vet inte hur jag ska göra

Stapel.java

package javaprylar;

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

public class Stapel extends JPanel
{
    int totAntalKast;
    int kastPerSida;
    int procentLangd;
    
    public Stapel(int totAntalKast,int kastPerSida){
        this.totAntalKast = totAntalKast; //Dessa används sen i nedanstående metod
        this.kastPerSida = kastPerSida; //Dessa används sen i nedanstående metod/
        
        procentLangd = (kastPerSida/totAntalKast)*100;
    }
    public void paintComponent (Graphics page)
    {
        super.paintComponent (page); 
        page.setColor (Color.blue);
        page.drawRect (50,50,20,procentLangd); // här ska höjd, längd och så ritas beroende på värderna ifrån konstruktorn.
    }
}
LimeMedlem sedan sep. 2001961 inlägg
#2

Refakturering

Tjing!

Jag har strukturerat om lite i koden så den "funkar".

TarningsTabell.java

package javaprylar;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class TarningsTabell extends JFrame {

	Random slump = new Random();
	int slumpatTal;
	int totAntalKast;
	private static int[] kast = new int[6];

	public TarningsTabell() {
		totAntalKast = 60;
		genereraSlumpTalsTabell();
		genereraJframe();
	}

	public TarningsTabell(int totAntalKast) {
		this.totAntalKast = totAntalKast;
		genereraSlumpTalsTabell();
		genereraJframe();
	}

	public void genereraJframe() {
		// Enklare att använda en gridbaglayout.
		
		GridBagLayout gridbag = new GridBagLayout();
		this.setLayout(gridbag);
		this.setSize(300, 300);
		this.setTitle("Tärning");
		this.setResizable(false);
		this.setLocation(400, 250);
		this.getContentPane().setBackground(Color.WHITE);

		// Deklarerar de ingående komponenterna här. Effektivare än inne i for-loopen.
		JLabel eyesLabel;
		JLabel countLabel;
		Stapel stapel;
		
		
		// Första kolumnens data.
		GridBagConstraints gbc_col1 = new GridBagConstraints();
		gbc_col1.anchor = GridBagConstraints.WEST; // Fäst komponenten i vänsterkanten.
		gbc_col1.fill = GridBagConstraints.NONE; // Gör den så stor som den behöver vara.
		gbc_col1.gridx = 0; // Sätt den i första kolumnen.
		gbc_col1.weightx = 0; // Låt den inte överblivet utrymme. Labba med den här så ska du få se på roligheter.
		gbc_col1.insets = new Insets(10,10,5,5); // Skapa en "ram" runt komponenten.
		

		GridBagConstraints gbc_col2 = new GridBagConstraints();
		gbc_col2.anchor = GridBagConstraints.WEST;
		gbc_col2.fill = GridBagConstraints.NONE;
		gbc_col2.gridx = 1; // Kolumn 2.
		gbc_col2.weightx = 0;
		gbc_col2.insets = new Insets(10,0,5,0);

		GridBagConstraints gbc_col3 = new GridBagConstraints();
		gbc_col3.anchor = GridBagConstraints.WEST;
		gbc_col3.fill = GridBagConstraints.BOTH;
		gbc_col3.gridx = 2; // Kolumn 3
		gbc_col3.weightx = 1; // Ta all överbliven plats som det bara går.
		gbc_col3.insets = new Insets(10,0,5,0);
		
		
		for (int i = 0; i < kast.length; i++) {

			// Det är bättre, säkare och effektivare att använda sig av
			// Integer-klassens metoder.
			eyesLabel = new JLabel(Integer.toString(i + 1));
			eyesLabel.setPreferredSize(new Dimension(15, 20));
			

			countLabel = new JLabel(Integer.toString(kast[i]));
			countLabel.setPreferredSize(new Dimension(25, 20));

			stapel = new Stapel(totAntalKast, kast[i]);
			
			
			gbc_col1.gridy = i;
			gbc_col2.gridy = i;
			gbc_col3.gridy = i;
			
			gridbag.setConstraints(eyesLabel, gbc_col1);
			gridbag.setConstraints(countLabel, gbc_col2);
			gridbag.setConstraints(stapel, gbc_col3);
			
			this.add(eyesLabel);
			this.add(countLabel);
			this.add(stapel);
			;
		}

		this.setVisible(true);
	}

	public void genereraSlumpTalsTabell() {
		for (int i = 0; i < totAntalKast; i++) {
			slumpatTal = slump.nextInt(6);
			kast[slumpatTal]++;
		}
		for (int i = 0; i < kast.length; i++) {
			System.out.println(i + 1 + " - " + (kast[i]));
		}
	}
}

Stapel.java

package javaprylar;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

@SuppressWarnings("serial")
// Ingen anledning att använda JPanel. Det är är en egen komponent.
public class Stapel extends Component
{
    int totAntalKast;
    int kastPerSida;
    
    public Stapel(int totAntalKast,int kastPerSida){
        this.totAntalKast = totAntalKast; //Dessa används sen i nedanstående metod
        this.kastPerSida = kastPerSida; //Dessa används sen i nedanstående metod/
   
    }
    public void paint(Graphics g)
    {
    	// 2D-grafiken har lite roligare och mer utvecklade grafiska metoder.
    	Graphics2D g2 = (Graphics2D) g;
        g.setColor(Color.RED);
        // Vi gör rektangel från övre högra hörnet av komponenten, alltså (0,0) i koordinatsystemet.
        g2.fillRect(0,0,getProcent(), 20); // här ska höjd, längd och så ritas beroende på värderna ifrån konstruktorn.
    }
    
    public Dimension getPreferredSize(){
        return new Dimension(450, 125);
    }

    
    private int getProcent()
    {
    	double result = ((double)kastPerSida/(double)totAntalKast)*200d;
    	return (int)result;
    }
}

TheDice är samma som du gjort. Fråga om det något du inte förstår.

AsaMedlem sedan dec. 20011 860 inlägg
#3

Tackar så hemskt mycket. Jag ska sätta mig ner lite senare och kika och återkommer här när jag har frågor som jag säker kommer ha några stycken. :)

En snabb grej.. jag har ingen ram runt mittensiffrorna. Hade du lagt till det? Står nogot om ram i dina kommentarer.

AsaMedlem sedan dec. 20011 860 inlägg
#4

Varför skriver du så här:
(double)kastPerSida ?
och inte
double kastPerSida?

Vad är detta? @SuppressWarnings("serial")

AsaMedlem sedan dec. 20011 860 inlägg
#5

Sen kommer jag göra om allt till en applet och visa det i sidan. Inte så det blir en "popup" ruta när man kör html filen. Så blir det nu när man kör det. Vill ha integrerat i appleten i htmlsidan.

Hur ändrar man få? Är det JFrame som strular till allt så det blir popup?

LimeMedlem sedan sep. 2001961 inlägg
#6

Asa skrev:

Varför skriver du så här:
(double)kastPerSida ?
och inte
double kastPerSida?

Vad är detta? @SuppressWarnings("serial")

Fråga 1:

Jag antar att det är det här du reagerar på?

private int getProcent()
    {
    	double result = ((double)kastPerSida/(double)totAntalKast)*200d;
    	return (int)result;
    }

(double) är en typkonvertering från den integer som kastPerSida och totAntalKast har till typen double. 200d markerar att jag använder mig av talet 200 som en double.

Orsaken till detta är för att jag vet hur matematiken i Java fungerar.

Om jag inte hade konverterat det så hade det blivit t.ex. så här:

int kastPerSida= 6
int totAntalKast = 60

resultat = 6/60*200 ->
resultat = 0*200 ->
resultat = 0;

Orsaken till det är att heltalsdivision i Java resulterar i ett heltal. 6/60 blir alltså 0 och inte 0.1.

Om jag då konvererar intarna till double så blir det

resultat = 6d/60d*200d ->
resultat = 0.1d*200d ->
resultat = 20

Gaaaaanska stor skillnad. Förstår du konceptet?

Fråga 2:

@SuppressWarnings("serial") är en annotation på klassen. Orsaken till det är att klassen Component är serialiserbar, d.v.s. man kan göra om den till en bit-ström och skicka runt den eller spara den på disc.

Om jag inte deklarerar ett attribut som talar om vilken version av klassen som den är så kommer kompilatorn att varna för det. Det attribut som man skapar är till för att både sändare och mottagare av en serialiserbar klass ska vara säkra på att de har samma version av klassen.

Den behövs egentligen inte och det tillhör lite överkurs, men jag lägger dit annotationerna per automatik.

LimeMedlem sedan sep. 2001961 inlägg
#7

Asa skrev:

Sen kommer jag göra om allt till en applet och visa det i sidan. Inte så det blir en "popup" ruta när man kör html filen. Så blir det nu när man kör det. Vill ha integrerat i appleten i htmlsidan.

Hur ändrar man få? Är det JFrame som strular till allt så det blir popup?

Det du då måste göra är att göra om din JFrame till en JApplet. Det blir lite andra saker att göra också.

http://java.sun.com/docs/books/tutorial/deployment/applet/getStarted.html är ett bra ställe att börja läsa på om applet. Själv avskyr jag dem.

LimeMedlem sedan sep. 2001961 inlägg
#8

Asa skrev:

Tackar så hemskt mycket. Jag ska sätta mig ner lite senare och kika och återkommer här när jag har frågor som jag säker kommer ha några stycken. :)

En snabb grej.. jag har ingen ram runt mittensiffrorna. Hade du lagt till det? Står nogot om ram i dina kommentarer.

Det är inte en "ram" egentligen, utan "Insets" som jag använder i GridBagConstraints berättar hur många pixlars tomrum jag vill ha runt den aktuella komponenten.

AsaMedlem sedan dec. 20011 860 inlägg
#9

Okje, tackar men går det att använda Flowlayout och blir det isåfall mindre kod? Vill testa lite med det för jag har än så länge bara hållt på med det hittils. Vill gå in på det med GridBag... senare.

AsaMedlem sedan dec. 20011 860 inlägg
#10

Jag har gjort så här men när jag kör detta i webbläsaren så kommer java"programmet" i en ruta istället för i sidan. Varför? Jag vill att det ska visas inne på websidan och inte i ett nytt javafönster. Vad har jag gjort för fel?

TheDice.html

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tärning</title>
</head>

<body>

<p><b>Utfall av 60 slumpade tärningskast:</b></p>
<applet code="JavaPrylar/TheDice.class" codebase="../classes" height="200" width="300">
	
</applet>

</body>
</html>

TheDice.java

package JavaPrylar;

import javax.swing.JApplet;

public class TheDice extends JApplet {    
    public void init ()
    {
        TarningsTabell tar = new TarningsTabell();
    }    
}

TarningTabell.java

package JavaPrylar;

import java.util.Random;
import javax.swing .*;
import java.awt.*;

public class TarningsTabell
{

    Random slump = new Random();
    int slumpatTal;
    int totAntalKast;
    private static int[] kast = new int[6];
                
    public TarningsTabell() {
        totAntalKast = 60;
        genereraSlumpTalsTabell();
        genereraJframe();
    }
    
    public TarningsTabell(int totAntalKast) {
        this.totAntalKast = totAntalKast;
        genereraSlumpTalsTabell();
        genereraJframe();
    }
    
    public void genereraJframe(){
        JFrame jf = new JFrame();
        jf.setLayout(new FlowLayout());
        jf.setSize(300,190);
        jf.setTitle("Tärning");
        jf.setResizable(true);
        jf.setLocation(400,250);
        jf.getContentPane().setBackground(Color.WHITE);
        
        JPanel ytan = new JPanel();
        
        for (int i = 0; i < kast.length; i++){      
            Siffror siffror = new Siffror(i + 1);
            siffror.setPreferredSize(new Dimension(15,20));
            
            Slumpat slumpade = new Slumpat(kast[i]);
            slumpade.setPreferredSize(new Dimension(25,20));
            
            Stapel stapeln = new Stapel(totAntalKast, kast[i]);
            stapeln.setPreferredSize(new Dimension(235,20));
                       
            jf.add(siffror);
            jf.add(slumpade);
            jf.add(stapeln);
        }
        
        jf.setVisible(true);
    }
    
    public void genereraSlumpTalsTabell(){   
        for (int i = 0; i < totAntalKast; i++){
            slumpatTal = slump.nextInt(6);
            kast[slumpatTal]++;
        } 
        for (int i = 0; i < kast.length; i++){
            System.out.println(i + 1 + " - " + (kast[i]) );
        } 
    }
    
    // Inre klassen för siffrorna 1-6
    private class Siffror extends JPanel {
        int tal;
        public Siffror(int tal){
             this.tal = tal;
        }
        public void paint(Graphics g) {
            super.paint(g); 
            setBackground(Color.WHITE);
            g.setColor(Color.BLACK);   
            g.drawString ("" + tal + "", 5, 15);
        }    
    }
    
    // Inre klassen för slumtade och ram
    private class Slumpat extends JPanel {
        int tal;
        public Slumpat(int tal){
             this.tal = tal;
        }
        public void paint(Graphics g) {
            super.paint(g); 
            setBackground(Color.WHITE);
            g.setColor(Color.BLACK);   
            g.drawRect(0,0,20,18);
            g.drawString ("" + tal + "", 5, 15);
        }    
    }
    
    // Inre klassen för stapeln
    private class Stapel extends JPanel
    {
        int totAntalKast;
        int kastPerSida;

        public Stapel(int totAntalKast,int kastPerSida){
            this.totAntalKast = totAntalKast; //Dessa används sen i nedanstående metod
            this.kastPerSida = kastPerSida; //Dessa används sen i nedanstående metod
        }
        
        public void paint(Graphics g)
        {
            super.paint(g);
            setBackground(Color.WHITE);
            g.setColor(Color.BLUE);            
            g.fillRect(0,5,getProcent(), 10); 
        }     
        
        private int getProcent()
        {
            // Typkonverterar kastPerSida och totAntalKast till double samt sätter 200 till en double
            double result = ((double)kastPerSida/(double)totAntalKast)*200d;
            // Typkonverterar result till heltal för slutliga utskrivningen efter uträkningen
            return (int)result;
        }
    } 
}
LimeMedlem sedan sep. 2001961 inlägg
#11

1. Du ska inte använda dig av en JFrame. JApplet är en JFrame, men för webben. Implementera den direkt i TarningsTabell.

2. I HTML-filen skriver du <applet code="JavaPrylar/TheDice.class" codebase="../classes" height="200" width="300">. Det är lite fel. code="klassnamnet" ska peka just på klassen. Klassen heter i ditt fall JavaPrylar.TheDice. Sedan är det kutym att INTE ha stora bokstäver i paketnamn för att lätt kunna skilja dem från klassnamn, som alltid ska börja med stor bokstav.

AsaMedlem sedan dec. 20011 860 inlägg
#12

1. Vad skall användas istället då för stt ställa in följande:

        jf.setLayout(new FlowLayout());
        jf.setSize(300,190);
        jf.setTitle("Tärning");
        jf.setResizable(true);
        jf.setLocation(400,250);
        jf.getContentPane().setBackground(Color.WHITE);

2. Okej, tackar! Ska tänka på det framöver.

AsaMedlem sedan dec. 20011 860 inlägg
#13

Hur implementerar jag det direkt i TarningsTabell då?

LimeMedlem sedan sep. 2001961 inlägg
#14

Asa skrev:

1. Vad skall användas istället då för stt ställa in följande:

        jf.setLayout(new FlowLayout());
        jf.setSize(300,190);
        jf.setTitle("Tärning");
        jf.setResizable(true);
        jf.setLocation(400,250);
        jf.getContentPane().setBackground(Color.WHITE);

Storleken på applet-fönstret ställs i html-filen eller i init-metoden.

Du implementerar appleten genom att göra extends JApplet istället för extends JFrame.

De flesta av de saker du vill göra ovan går att göra i JApplet. Om du deklarerar klassen TarningsTabell extends JApplet så går det att använda this.setLayout(new FlowLayout()); o.s.v. i init-metoden, eller den metod som skapar själva innehållet, om den anropas från init-metoden.

init-metoden i en Applet är som main-metoden i vanliga program.

storleken ställer du i html-filen som startar appleten, title är inte nödvändigt att sätta, eftersom den normalt sätter titeln i ett fönster, och ett sådant har du ju egentligen inte. En applet är per definition inte möjligt att ändra storleken på. Samma sak med var den ska visas, eftersom det bestäms av html-sidan. Även en Applet har en contentPane.

AsaMedlem sedan dec. 20011 860 inlägg
#15

Tackar så mycket :)

AsaMedlem sedan dec. 20011 860 inlägg
#16

Har problem med denna koden. När jag klickar på knappen Kasta igen så lägger den på de slumpade värderna på de redan existerande värderna från tidigare omgång. Kan någon se vilket fel det är. Har suttit och kikat i timmar nu utan att komma på felet.

Är säkert nåt litet fel men jag ser det dock inte. Please help mee..

TheDice_2.java

package javaprylar;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TheDice_2 extends JFrame {     
    private TarningsTabell tar; 
    private JButton knapp;
    private JLabel medel;
    private JLabel total;
    private int antalKastTot = 1;
    private static int medelUtfall;
    
    public TheDice_2()
    {
        // Sätter bakgrundfäg på hela ytan
        super("Tärningsfrekvenser");     
        setLayout(new FlowLayout()); 
        this.getContentPane().setBackground(new Color(255, 255, 255));
        
        // Skapar upp TarningsTabell och genererar talen och sätter fast bredd
        tar = new TarningsTabell(); 
        tar.genereraSlumptalsTabell();
        tar.setPreferredSize(new Dimension(300,235));
        
        // Skapar upp en panel för Kasta igen knappen med vald layout,
        // storlek och bakgrundsfärg
        JPanel kastaPanel = new JPanel();
        kastaPanel.setLayout(new FlowLayout());
        
        knapp = new JButton("Kasta igen!");
        kastaPanel.add(knapp);   
        kastaPanel.setPreferredSize(new Dimension(300,35)); 
        kastaPanel.setBackground(new Color(255, 255, 255));    
              
        // En knapplyssnare läggs till
        knapp.addActionListener(new KnappEvent());
        
        // Alla underpaneler läggs på huvudpanelen
        this.add(kastaPanel);
        this.add(tar);
    }
    
    // Knapplyssnaren
    private class KnappEvent implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            if(event.getSource() == knapp)
            {
                // Anropar det som genererar talen och ritar om allt och 
                // ökar antalKastTot med ett och skriver ut medel och antalKastTot
                tar.genereraSlumptalsTabell();
                tar.repaint();
            }
        }
    }
    
    public static void main (String[] args)
    {
        // Skapar upp själva ytan och sätter storlek, bgfärg m.m
        TheDice_2 dice = new TheDice_2();
        dice.setSize(300,270);
        dice.setResizable(false);
        dice.setLocation(400,300);
        dice.setBackground(new Color(255, 255, 255));        
        dice.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        dice.setVisible(true);
    }  
}

TarningsTabell.java

package javaprylar;

import java.util.Random;
import javax.swing .*;
import java.awt.*;
import java.text.DecimalFormat;

public class TarningsTabell extends JPanel
{
    // Instansvariabler
    private Random slump;
    private int slumpatTal;
    private int totAntalKast;
    private static int[] kast;
    DecimalFormat fmt = new DecimalFormat("0.##");
    private static int antalKastTot = 0;
    
    // Konstruktorn som sätter antal kast till 60, skapar upp random
    // och skapar en array med 6 index
    public TarningsTabell() {
        totAntalKast = 60;
        slump = new Random();
        kast = new int[6];
    }
    
    // Konstruktorn som sätter antal kast till det som skickats in via TheDice
    // och skapar upp random och skapar en array med 6 index
    public TarningsTabell(int totAntalKast) {
        this.totAntalKast = totAntalKast;
        slump = new Random();
        kast = new int[6];        
    }
    
    public void genereraSlumptalsTabell(){ 
        
        // Genererar slumptalen och sparar antal kast av varje värde i indexen 1-6
        for (int i = 0; i < totAntalKast; i++){
            slumpatTal = slump.nextInt(6);
            kast[slumpatTal]++;
        } 
        // Endast koll om det visas rätt tal i appleten.
        for (int i = 0; i < kast.length; i++){
            System.out.println(i + 1 + " - " + (kast[i]) );
        } 
        // Ökar antalkastomgångar totalt med 1
        antalKastTot++;
    }
    
    // Detta räknar ut medelutfallen
    public double medelUtfall(){ 
        double medel=0;
        
        for (int i = 0; i < kast.length; i++){
            medel += (i+1)*kast[i];
        } 
        return medel/totAntalKast;
    }
    
    // denna använder icke jag i min version
    public int[] getKast(){
        return this.kast;
    }
    
    // Det grafiska
    public void paintComponent (Graphics g)
    {
        super.paintComponent (g);
        // sätter bakgrunden till vald färg
        this.setBackground (new Color(255,255,255));
        
        int posY1 = 20;
        int posY2 = 11;
        int maxval=0, minval=99999;
        
        // Gör en koll vilket som är det lägsta samt högsta talet
        for (int i = 0; i < kast.length; i++){
            if (kast[i] > maxval){
                maxval = kast[i];
            }
            if (kast[i] < minval){
                minval = kast[i];
            }
        }
        
        // Ritar ut alla siffro och stapeln
        for (int i = 0; i < kast.length; i++){   
            g.setFont(new Font("Arial", Font.PLAIN, 13));
            
            // Siffrorna 1-6. Måste sätta + 1 då jag satt att i = 0 som 
            // utgångspunkt och sätter textfärg till svart
            g.setColor(Color.BLACK);   
            g.drawString ("" + (i + 1) + "", 15, posY1);
            
            // Antal kast som genererats för siffrorna 1-6 med textfärg svart
            // samt en ram runt allt
            g.setColor(Color.BLACK);   
            g.drawRect(28,posY1-15,29,posY2+8);
            g.drawString ("" + kast[i] + "", 35, posY1+1);
            
            // Kollen om stapeln skall vara röd, grön eller blå. Beroende om
            // värdet är minst, högst eller annat.
            if(kast[i]==maxval){
                g.setColor(Color.GREEN);     
            }else if(kast[i]==minval){
                g.setColor(Color.RED); 
            }else{
                g.setColor(Color.BLUE); 
            }
            // Ritar ut stapeln och anropar getProcent för att veta stapelns längd
            g.fillRect(58,posY1-10,getProcent(kast[i],totAntalKast), posY2); 
            posY1 += 20; 
        }   
        // Sätter textfärg till svart
        g.setColor(Color.BLACK); 
        //  Skriver ut medel och hämtar värde från medelUtfall
        g.drawString("Medelutfall denna session: " + medelUtfall(), 15, 145);
        //  Skriver ut totalt antal omgångar
        g.drawString("Totalt antal kastomgångar: " + antalKastTot, 15, 165);
    }
    
    // Räknar ut hur lång en stapel skall vara i procent
    private int getProcent(int kastPerSida,int totAntalKast)
   {
        // Typkonverterar kastPerSida och totAntalKast till double samt sätter 200 till en double
        double result = ((double)kastPerSida/(double)totAntalKast)*200d;
        // Typkonverterar result till heltal för slutliga utskrivningen efter uträkningen
        return (int)result;
   }  
}
LimeMedlem sedan sep. 2001961 inlägg
#17

Återställa arrayen

Felet ligger i hur du hanterar arrayen du sparar "markeringarna" i.

Om man kör programmet i debuggern så blir det så här.

          För varje varv du kör i loopen
          1\. Slumpa fram ett tal.
          2\. Lägg till ett på det indexet i arrayen.
          
          Första gången du kör den så skapar den 60 stycken värden i arrayen.
          Den ser då ut såhär:  (int\[\]) \[10, 9, 10, 11, 12, 8\].
          
          
          Andra gången du kör den så skapar den också 60 stycken värden men
          eftersom du inte har återställt arrayen så ser den fortfarande ut som
          ovan när du börjar och t.ex såhär  (int\[\]) \[14, 18, 18, 22, 25, 23\] när du är klar.
          Det finns alltså 120 markeringar i arrayen. 

Om du istället initierar om arrayen varje gång du går in i generaraSlumptalsTabell så funkar det.

public void genereraSlumptalsTabell(){ 
  [B]  	kast = new int[6];[/B]
        // Genererar slumptalen och sparar antal kast av varje värde i indexen 1-6
        for (int i = 0; i < totAntalKast; i++){
            slumpatTal = slump.nextInt(6);
            kast[slumpatTal]++;
        } 
        // Endast koll om det visas rätt tal i appleten.
        for (int i = 0; i < kast.length; i++){
            System.out.println(i + 1 + " - " + (kast[i]) );
        } 
        // Ökar antalkastomgångar totalt med 1
        antalKastTot++;
    }
AsaMedlem sedan dec. 20011 860 inlägg
#18

Tack för hjälpen. Funkar fint :)

150 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)