Zufallsexperiment im horizontalen Balkendiagramm

Ida

Mitglied
Guten Morgen,

eine nächste Frage von mir :)

Und zwar bin ich gerade dabei, ein Programm zu schreiben, welches die Ergebnisse eines
Zufallsexperiments ("Würfeln") per jPanel in einem horizontalen Balkendiagramm anzeigen
soll.
Dabei soll jeder Balken darstellen, wie oft der einzelne Wert vorgekommen ist.

Der Code kommt gleich!
Für eure Hilfe wäre ich (wie immer ;-)) sehr dankbar!!

Liebe Grüße,
Ida
 

Ida

Mitglied
ja, entschuldigt bitte. Ich hätte mit dem ersten Post etwas warten sollen.
Habe noch ein bisschen rumprogrammiert - hat leider etwas länger gedauert als gedacht-

Hier nun der Code.
Mein Problem ist, dass kein vernünftiges horizontales Balkendiagramm angezeigt wird,
sondern nur ein Balken, und ich von euch gerne wissen würde, wo mein Denkfehler liegt.





Java:
import java.awt.Font;
import java.awt.Color; 
import java.awt.Graphics;  
import javax.swing.JPanel; 
import java.util.Random;
 

public class Aufgabe extends JPanel
{
    private double x; //
    private double xValue1 = 10; 
    private double xValue2 = 15;
    private double xValue3 = 20;
    private double xValue4 = 25;
    private double xValue5 = 30;
    private double xValue6 = 35;
    private double y = 10;
    private double h = 10;
    private double b = 0; 
    
    private int dice1 = 0; 
    private int dice2 = 0; 
    private int dice3 = 0; 
    private int dice4 = 0; 
    private int dice5 = 0; 
    private int dice6 = 0; 

    public void paintComponent( Graphics g )
    {
        super.paintComponent( g ); 
        
        this.setBackground( Color.GRAY );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("Distribution", 0, 5 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("1: ", 0, 10 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("2: ", 0, 15 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("3: ", 0, 20 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("4: ", 0, 25 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("5: ", 0, 30 );
        
        g.setFont( new Font( "SansSerif", Font.PLAIN, 12 ) );
        g.drawString("6: ", 0, 35 );
        
        Random randomNumbers = new Random();
                
        for( int counter = 1; counter <= 100; counter++ ) //
        {
            int rollTheDice = 1 + randomNumbers.nextInt(6);
                    
            switch( rollTheDice )
            {    
                case 1:
                    ++dice1;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue1, (int) y, (int) b++, (int) h ); 
                    break;
        
                case 2:
                    ++dice2;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue2, (int) y, (int) b++, (int) h ); 
                    break;
                    
                case 3:
                    ++dice3;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue3, (int) y, (int) b++, (int) h ); 
                    break;
                    
                case 4:
                    ++dice4;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue4, (int) y, (int) b++, (int) h); 
                    break;
                    
                case 5:
                    ++dice5;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue5, (int) y, (int) b++, (int) h ); 
                    break;
                    
                case 6:
                    ++dice6;
                    g.setColor( Color.BLACK ); 
                    g.fillRect( (int) xValue6, (int) y, (int) b++, (int) h );
                    break;
            }
        }
    } 
}
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Ich kann zwar verstehen, dass man als Anfänger am liebsten gleich eine schöne Oberfläche sieht, statt eines schwarzen Konsolenfensters.
Trotzdem ist es wichtig sich mit den Grundlagen, grundlegenden Elementen und Algorithmen auseinander zusetzen.
Da wären z.B. Listen, Arrays... ausserdem würde nochmal über den Code drüberschauen, da sind 20 bis 30% Zeilen überflüssig (da scheinbar das Verständnis fehlt, was Objekte sind und was so manche Methode bewirkt)
Grundsätzlich gilt auch in der paintComponent wird nach Möglichkeit nur gezeichnet die ganze Berechnung der Zufallszahlen kann ohne Probleme ausgelagert werden.
 

Ida

Mitglied
Wo muss ich denn im Code ansetzen, damit nicht alle meine Balken übereinander liegen?
Der Rest ist ja schon so, wie ich ihn haben möchte.
 
D

Dow Jones

Gast
Wenn ich das richtig sehe, dann werden die Balken alle an der gleichen y-Position aber an unterschiedlichen x-Positionen gezeichnet (mit mehr oder weniger unterschiedlicher Breite). Das führt freilich dazu das sich die Dinger überlappen. Versuchs doch mal anders herum, nämlich die Balken an unterschiedlichen y-Positionen aber gleichen x-Positionen zu zeichnen. Dann stehen sie alle untereinander und können sich seitwärts ausbreiten.

Ein weiterer Fehler scheint mir zu sein, das du für die Breite überall die gleiche Variable b verwendest. Dadurch erhalten alle Balken mehr oder weniger die gleiche Breite. Da sollte wahrscheinlich nicht b sondern dice1 bis dice6 stehen. Wenn du die Zeilen mit dem Aufruf von fillRect etwas abänderst dürftest du schon wesentlich bessere Ergebnisse erzielen:
[Java]
g.fillRect( (int) x, (int) yValue1, (int) dice1, (int) h );
...
g.fillRect( (int) x, (int) yValue2, (int) dice2, (int) h );
...
[/Java]

Weiterhin werden deine ganzen Variablen nur ein einziges mal mit dem Wert 0 initialisiert, und zwar bei der anfänglichen Erzeugung des JPanel-Objekts. Danach werden sie aber bei jedem Neuzeichnen des JPanels zufallsgesteuert erhöht, was vermutlich zu einem ziemlich unvorhersehbaren Ergebnis führen wird. Jedenfalls werden alle Balken bei jedem mal Zeichnen ein Stück länger, bis sie schließlich nicht auf den Bildschirm passen. Daher solltest du gleich am Anfang der paintComponent Methode noch entsprechende Zeilen einfügen:
[Java]
dice1 = 0;
dice2 = 0;
dice3 = 0;
...
[/code]

Grundsätzlich ist es übrigens keine gute Idee die Würfelsimulation durch den Zufallsgenerator in einer paint Methode zu schreiben. Das führt (wie schon erwähnt) dazu, das man bei jedem Mal neuzeichnen des Panels andere Werte (und damit andere Balkenbreiten) erhält. Das ist wahrscheinlich nicht das, was haben eigentlich haben möchte... Schöner ist es die Zufallszahlen außerhalb der paint Methode zu erzeugen, denn dann kann man beim painten jedesmal wieder die gleichen Werte verwenden, und dadurch "springen die Balken nicht herum" wenn man mal das Fenster verschiebt.

Ein weiterer Tipp: Zeichne die Balken nicht nach jeder einzelnen erzeugten Zufallszahl. Es reicht wenn du erst alle 100 Zahlen erzeugst (und dir die Ergebnisse in den Variablen dice1 bis dice6 merkst), und danach die sechs Balken zeichnest.
Es mag vielleicht reizvoll sein den Balken beim "wachsen" zusehen zu wollen, aber das wird auf diese Weise nicht funktionieren. Schon allein weil das Programm zu schnell abgearbeitet wird um das wachsen zu erkennen... ;)
 

Ähnliche Java Themen

Neue Themen


Oben