Archief - [prog][java]

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.

Candyman66

Legacy Member
Io,

Voor school hebben we enkele tryouts gekregen om te maken ivm threads in java. Het zou normaal geen probleem mogen zijn maar ik zit toch gedeeltelijks vast. Het doel van het programma is een klein tellerke te maken met behulp van een thread.Het getal komt op een JPanel te staan in een frame, en in de thread wordt dus telkens om de seconde een variabele verhoogt met 1.
Ik heb volgende code zelf al gemaakt:

import javax.swing.*;

public class Counter implements Runnable {

private int sleepTime;
private int count = 1;
private JLabel countLabel;

public Counter(JLabel label) {

sleepTime = 1000;
setCountLabel(label);
voerUit();
}

public JLabel getCountLabel() {
return countLabel;
}

public void setCountLabel(JLabel countLabel) {
this.countLabel = countLabel;
}

public void run() {


try
{
Thread.sleep(sleepTime);
countLabel.setText(Integer.toString(count));
count++;
}
catch (InterruptedException exception)
{
exception.printStackTrace();
}

}

public void voerUit() {
while (count != 5) {
run();
}
}

}

public class TestCounter extends JFrame {

/**
* @param args
*/


public static void main(String[] args) {
// TODO Auto-generated method stub

Thread thread1;
Counter counter1;
JLabel label = new JLabel();
counter1 = new Counter(label);
thread1 = new Thread(counter1);
thread1.start();
JFrame frame = new JFrame("Counter 1");
frame.add(label);
frame.setSize(300,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

}

Het probleem is als volgt, als ik het uitvoer dan laat hij pas bij de laatste verhoging het frame zien met jpanel en de tekst.
Iemand die mijn fout misschien ziet of raad weet hiermee ? :)

Kn0t

Legacy Member
In je constructor van counter roep je voerUit op, die de teller zal verhogen tot 5. Je doet hier dus helemaal geen multi-threading, dit gebeurt gewoon op de main thread.

Je mag nooit ZELF de run methode oproepen. De run methode van je Runnable wordt automatisch uitgevoerd wanneer je de thread start waar je je Runnable hebt aan meegegeven. Je moet de while lus verplaatsen naar je run methode.

Zoals je applicatie nu inéén zit gaat deze regel:
counter1 = new Counter(label); 4 seconden duren.
Op de label staat nu 4, en je counter = 5.

Dan start je een nieuwe thread op, die dus de run methode van je Counter gaat oproepen, waardoor de label op 5 gezet wordt, en counter = 6.

.Acku.

Legacy Member
Code:
import javax.swing.*;

public class Counter implements Runnable {

	private int sleepTime;

	private int count = 1;

	private JLabel countLabel;

	public Counter(JLabel label) {

		sleepTime = 1000;
		setCountLabel(label);
	}

	public JLabel getCountLabel() {
		return countLabel;
	}

	public void setCountLabel(JLabel countLabel) {
		this.countLabel = countLabel;
	}

	public void run() {

		try {
			Thread.sleep(sleepTime);
			countLabel.setText(Integer.toString(count));
			count++;
		} catch (InterruptedException exception) {
			exception.printStackTrace();
		}

	}



}

	public class TestCounter extends JFrame {

	/**
	 * @param args
	 */

		public static void main(String[] args) {
// TODO Auto-generated method stub

			Thread thread1;
			Counter counter1;
			JLabel label = new JLabel();
			counter1 = new Counter(label);
			thread1 = new Thread(counter1);
			thread1.start();
			JFrame frame = new JFrame("Counter 1");
			frame.add(label);
			frame.setSize(300,300);
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
}}

Je roept voieruit op in je constructor, die dan run() oproept. Dat doet ie niet in een parate thread maar in die van zichzelf, waardoor ie blokkeert tot 5.
Je mag run() nooit oproepen, enkel start(), die dan achter de schermen run voor jou oproept.

Candyman66

Legacy Member
merci kn0t, ik heb zo aangepast dat ik die method voerUit niet meer gebruik, ik heb mijn while lus dus ook in de run() gezet. Het werkt perfect nu :applause:

en idd, zoals ik het nu heb is het geen multi-threading, maar de volledige opgave was dat ik zo 5 van die counterframekes naast elkaar zet.Maar dit laatste is geen probleem meer om te maken :)

Emerxill

Legacy Member
Die code komt mij verdacht bekend voor
Zit gij toevallig niet op de Xios Hogeschool? :D

Candyman66

Legacy Member
Emerxill zei:
Die code komt mij verdacht bekend voor
Zit gij toevallig niet op de Xios Hogeschool? :D

Damn it, ge hebt mij door :p

In ieder geval, moest ge hier ook bij vast zitten, ge hebt de oplossing voor uwe neus staan nu :D
Allez ja, als ge zelf nog wel daar op school zit tenminste ^^

Emerxill

Legacy Member
Candyman66 zei:
Damn it, ge hebt mij door :p

In ieder geval, moest ge hier ook bij vast zitten, ge hebt de oplossing voor uwe neus staan nu :D
Allez ja, als ge zelf nog wel daar op school zit tenminste ^^
Merci, maar ik ben al ff afgestudeerd...
Moest gij daarintegen nog ergens mee vastzitten wil ik best ens opzoeken wat ik nog allemaal heb van op school en wil ik ook wel helpen... :)
(als ik tijd heb that is... ;))
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