# Grafik hängt sich auf



## Ference (3. Feb 2013)

Hallo zusammen...
mein Programm hängt sich auf wenn es eine for-schleife durchlaufen soll (Grafik)
Habe schon hier im ein wenig rumgelesen, bin aber nicht schlauer geworden :/


```
public void zufall(int läufe) 
	{
		of.getfortschritt().setValue(0);
		of.getfortschritt().setIndeterminate(false);
		of.getfortschritt().repaint();
		
		Random r1 = new Random();
		int z1;
		int value = 0;
		
		for(int i = 1; i <= läufe; i++)
		{
			z1 = r1.nextInt(2);
			z1++;
			//value = value+(läufe/100);
			of.getfortschritt().setValue(i);
			of.getfortschritt().repaint();
			System.out.println(z1);
		}
		
	}
```

Mit den zufällig generierten Zahlen soll noch weiter gerechnet werden, es bleibt also nicht so sinnfrei wie es gerade ist 

Es soll etwas Simmuliert werden.... und zwar x umläufe , darum eine progress bar 

Bitte um Hilfe
Ference


----------



## Spacerat (3. Feb 2013)

Wo bitte läuft denn diese For-Schleife? Naja, eigentlich nicht schwer zu erraten... auf dem EDT (oder ähnlichem). Das bedeutet, dass der Fortschritt gar nicht angezeigt wird, lediglich das letzte Bild erscheint und es sieht aus, als ob es hängt. Du musst dem EDT auch schon Zeit geben, die durch "repaint()" gequeuete PaintEvents auszuführen, diese For-Schleife gehört also in einen extra Thread.


----------



## Ference (4. Feb 2013)

Ich glaub ich hab das falsch verstanden bzw. was falsch gemacht >.<


```
public void zufall(int läufe) 
	{
		of.getfortschritt().setValue(0);
		of.getfortschritt().setIndeterminate(false);
		of.getfortschritt().repaint();
		
		int x =1;
		ZufallThread t1 = new ZufallThread();
		
		while(x <= läufe)
		{
			t1.start();
			of.getfortschritt().setValue((läufe/100)*x);
			of.getfortschritt().repaint();
			x++;
		}
	}
```


```
public class ZufallThread extends Thread
{
	private Random r1;
	private int z1;
	
	ZufallThread()
	{
		r1 = new Random();
	}
	
	public void start()
	{
		z1 = r1.nextInt(2);
		z1++;
		System.out.println(z1);
	}
}
```


----------



## Marco13 (4. Feb 2013)

Ja, offenbar. Aus dem Codestück jetzt ein KSKB zu machen... da habe ich gerade _auch_ keine Lust drauf. Auf How to Use Progress Bars (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components) gibt's eigentlich schon ein paar Beispiele, mit denen man schnell reinkommen sollte. Hast du dir das schon angesehen?


----------



## Spacerat (4. Feb 2013)

Ference hat gesagt.:


> Ich glaub ich hab das falsch verstanden bzw. was falsch gemacht >.<


Nur geringfügig... Der Thread macht keinen Sinn, solange man nicht die Problemmethode "repaint()" in dessen "run()"-Methode aufruft. Diese liegt bei dir immer noch ausserhalb. Am besten, du verlagerst die Zeilen 3 bis 20 deines ersten Posts komplett in die "run()"-Methode des Threads aus.


----------



## Ference (4. Feb 2013)

```
ZufallThread(Oberfläche o)
	{
		of = o;
		läufe = Integer.parseInt(of.getAnzahl().getText());
	}
	
	public void run()
	{
		 of.getfortschritt().setValue(0);
	        of.getfortschritt().setIndeterminate(false);
	        of.getfortschritt().repaint();
	        
	        Random r1 = new Random();
	        int z1;
	        int value = 0;
	        
	        for(int i = 1; i <= läufe; i++)
	        {
	            z1 = r1.nextInt(2);
	            z1++;
	            value = value+(läufe/100);
	            of.getfortschritt().setValue(value);
	            of.getfortschritt().repaint();
	            System.out.println(z1);
	        }
	}
```

geht immernoch nicht ...


----------



## Spacerat (4. Feb 2013)

Und wie startest du den Thread nun? Wenn das noch so aussieht wie in deinem 2. Post, ists kein Wunder. Deine "zufall()"-Methode sollte etwa so aussehen:

```
public void zufall() 
    {
        ZufallThread t1 = new ZufallThread(of);
        t1.start();
        try {
          t1.join();
        } catch(InterruptedException e) {
        }
    }
```


----------



## Ference (4. Feb 2013)

habe ich hinzugefügt, geht aber immer noch nicht


----------



## Spacerat (4. Feb 2013)

Und was genau geht nicht? Evtl. liegts ja daran, dass du Ümlaute im Quelltext ausserhalb von Ganterpranken (DoubleQuotes oder Anführungszeichen) verwendest.


----------



## Ference (4. Feb 2013)

ja die grafik beleibt hängen... wenn ich starte bewegt sich der balken nicht mehr und wenn die schleife durchgelaufen ist wird er plötzlich als voll angezeigt ...


----------



## Spacerat (4. Feb 2013)

Ui, da hab' ich anscheinend was übersehen...
"läufe" ist ein int und ter Teiler 100 ist ein int. Das Ergebnis wird erst 1 (voll) wenn "läufe" >= 100 ist, ansonsten bleibt es 0. "value" sollte auf jedenfall ein float werden und aus der 100 (Post 6, Zeile 21) macht man mal ein 100.0F. So bekommt man Zahlen zwischen 0 und 1 und nicht blos 0 oder 1.


----------



## Ference (6. Feb 2013)

```
public void run()
	{
		of.getfortschritt().setMaximum(läufe);
		of.getfortschritt().setMinimum(0);
	        
		Random r1 = new Random();
		int z1;
		int value = 0;
	        
		for(int i = 1; i <= läufe; i++)
		{
			z1 = r1.nextInt(2);
			z1++;
			
			value++;
			of.getfortschritt().setValue(value);
			of.getfortschritt().repaint();
			System.out.println(z1);
		}
	}
```

wenn ich es richtig verstehe müsste es so auch gehen, oder?
falls ja muss ich euch enttäuschen ... geht immernoch nicht -.-


----------



## Spacerat (6. Feb 2013)

Keine Ahnung, was Oberfläche bei get-/setFortschritt für Werte erwartet, aber ich denke mal Werte zwischen 0 (0%) und 1 (100%). Natürlich funktioniert das dann nicht, wenn du Werte zwischen 0 und 100 übergibst. Es funktioniert auch dann nicht, wenn du Integer durch Integer durch Integer teilst, weil der Wert dann 99% lang 0 und 1% lang 1 ist.


----------



## Ference (6. Feb 2013)

ich habe doch jetzt das Max. Value auf "läufe" gesetzt ... heißt wenn es 100 läufe sind müsste beim 50 lauf das Value auf 50 stehen... wären es 1000 durchläufe halb bei 500, dass regelt doch die progressbar, oder?

Z1 hat nichts mit der progressbar zu tun... mit denen will ich ja dann irgendwann weiterrechnen , aber erst soll die Progressbar funktionieren...


----------



## Spacerat (6. Feb 2013)

Wie gesagt: Ich weis weder, was dass für 'ne Progressbar ist noch was das für 'ne Oberfläche ist. Ist es Swing, hast du evtl. nur irgendwo ein "super.paintComponent()" vergessen was die Repaintkette unterbricht. "Müsste gehen, tut's aber nicht ist" nicht wirklich hilfreich.


----------



## Ference (6. Feb 2013)

Ja ist swing 


```
fortschritt = new JProgressBar();
		fortschritt.setBounds(50, 300, 300, 25);
		fortschritt.setVisible(true);
		fortschritt.setForeground(c);
		fortschritt.setIndeterminate(true);
```


wo müsste das "super.paintComponent()" dann hin?


----------



## bERt0r (6. Feb 2013)

Öhm wenn man in der gleichen Methode in der man den thread startet danach wieder ein join macht, und diese Methode auf dem EDT läuft, wird der doch genauso blockiert oder?


----------



## Spacerat (6. Feb 2013)

bERt0r hat gesagt.:


> Öhm wenn man in der gleichen Methode in der man den thread startet danach wieder ein join macht, und diese Methode auf dem EDT läuft, wird der doch genauso blockiert oder?


Bei Swing schon, aber wie gesagt, ich hatte keinen Plan, was das für 'ne Oberfläche war und nach wie vor auch nicht davon, wo "zufall()" aufgerufen wird. Wenn's auf dem EDT ist, ist "join()" natürlich störend. "super.paintComponent()" gehört in jede JComponent, die "paintComponent()" überschreibt, evtl. ist Oberfläche ja bereits eine solche Klasse.


----------



## Ference (7. Feb 2013)

```
public class Oberfläche extends JPanel
{
	private Rechner rechner;
	private JMenuBar menu;
	private JPanel zufall;
	private JLabel durchläufe;
	private JTextField anzahl;
	private JCheckBox zuf;
	private JProgressBar fortschritt;
	private JButton start;
	private Color c = new Color(0,205,0);
	
	Oberfläche()
	{
		this.setLayout(null);
		this.setBackground(Color.WHITE);
		
		rechner = new Rechner(this);
		
		menu = new JMenuBar();
		menu.setVisible(true);
		menu.add(MenuDatei());
		menu.add(MenuEinstellungen());
		menu.add(MenuInfo());
		
		fortschritt = new JProgressBar();
		fortschritt.setBounds(50, 300, 300, 25);
		fortschritt.setVisible(true);
		fortschritt.setForeground(c);
		fortschritt.setIndeterminate(true);    
		
		start = new JButton("Start!");
		start.setBounds(360, 300, 75, 25);
		start.setVisible(true);
		start.addActionListener(new Buttonhandler());
		
		zufall = new JPanel();
		zufall.setBackground(getBackground());
		zufall.setLayout(null);
		zufall.setBounds(10,20,150,70);
		zufall.setVisible(true);
		
		durchläufe = new JLabel("Durchläufe:");
		durchläufe.setBounds(10,35,80,25);
		durchläufe.setVisible(true);
		
		anzahl = new JTextField();
		anzahl.setBounds(80,40,50,20);
		anzahl.setVisible(true);
		
		zuf = new JCheckBox("Zufall");
		zuf.setBounds(10, 15, 80, 25);
		zuf.setBackground(getBackground());
		zuf.setVisible(true);
		
		zufall.setBorder(new TitledBorder("Zufall")); 	
		zufall.add(durchläufe);
		zufall.add(anzahl);
		zufall.add(zuf);
		
		this.add(zufall);
		this.add(fortschritt);
		this.add(start);
	}
	
	private class Buttonhandler implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e) 
		{
			if(e.getSource() == start && zuf.isSelected() == true)
			{
				fortschritt.setIndeterminate(false);
				rechner.zufall();
				fortschritt.setIndeterminate(true);
			}			
		}		
	}

	private JMenu MenuInfo() 
	{
		JMenu info = new JMenu("?");
		
		JMenuItem über = new JMenuItem("Über");
		
		info.add(über);
		
		return info;
	}

	private JMenu MenuEinstellungen() 
	{
		JMenu einstell = new JMenu("Einstellungen");
		
		JCheckBox diagramm = new JCheckBox("Diagramm");
		JMenuItem optionen = new JMenuItem("Optionen");
		
		einstell.add(diagramm);
		einstell.addSeparator();
		einstell.add(optionen);
		
		return einstell;
	}

	private JMenu MenuDatei() 
	{
		JMenu datei = new JMenu("Datei");
		
		JMenuItem exit = new JMenuItem("Schließen");
		JMenuItem speichern = new JMenuItem("Speichern");
		JMenuItem laden = new JMenuItem("Laden");
		JMenuItem neu = new JMenuItem("Neu");
		
		datei.add(neu);
		datei.addSeparator();
		datei.add(laden);
		datei.add(speichern);
		datei.addSeparator();
		datei.add(exit);
		
		return datei;
	}
	
	public JMenuBar getMenu()
	{
		return menu;
	}
	
	public JProgressBar getfortschritt()
	{
		return fortschritt;
	}
	
	public JTextField getAnzahl()
	{
		return anzahl;
	}
}
```


```
public class Rechner 
{
	private Oberfläche of;
	
	Rechner(Oberfläche o)
	{
		of = o;		
	}
	
	public void zufall() 
	{
	
		ZufallThread t1 = new ZufallThread(of);
		t1.start();
		
		try 
		{
		t1.join();
		} 
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}
```


```
public class ZufallThread extends Thread
{
	private Oberfläche of;
	private int läufe;
	
	ZufallThread(Oberfläche o)
	{
		of = o;
		läufe = Integer.parseInt(of.getAnzahl().getText());
	}
	
	public void run()
	{
		of.getfortschritt().setMaximum(läufe);
		of.getfortschritt().setMinimum(0);
	        
		Random r1 = new Random();
		int z1;
		int value = 0;
	        
		for(int i = 1; i <= läufe; i++)
		{
			z1 = r1.nextInt(2);
			z1++;
			
			value++;
			of.getfortschritt().setValue(value);
			of.getfortschritt().repaint();
			System.out.println(z1);
		}
	}
}
```


----------



## Spacerat (7. Feb 2013)

Okay, dann entferne dieses Join-Konstrukt inkl. Try-Catch-Block wieder, dann müsste es gehen.


----------



## Ference (7. Feb 2013)

Jetzt gehts, super  
Danke !!


----------

