Gå til innhold

oppdatere textfelt i for løkke


Anbefalte innlegg

jeg har følgende metode i java-programmet mitt:

 

public void erlik(){

 

for ( int i = 0; i < 9; i++){

String j = ""+(i);

tallfelt.setText(j);

System.out.println(j);

try {

Thread.sleep(200);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

}

 

println gjør som forventet, altså den skriver ut alla talla, mens setText kun viser 8 i tekstfeltet, burde ikke denne også vist alle talla 0-8 slik som println?

Lenke til kommentar
Videoannonse
Annonse
Nei, det burde den ikke. Det du gjør er nemlig å overskrive tallfelt for hvert gjennomløp. Du må derfor bygge opp en streng i for-løkka, og så sette tallfelt.setText(denStrengen); etter at du har traversert for-løkka.

 

Men da vil jeg få en utskrift alà:

 

012345678 om jeg forstår deg riktig?

eller vil den oppdatere et og et tall etterhvert?

Lenke til kommentar

Problemet kan være at GUI-en ikke oppdaterer det synlige tekstfeltet selv om du kaller setText. Thread.sleep kan f.eks. pause samme tråden som tegner tekstfeltet på nytt.

 

Om dette er problemet kan du kanskje fikse det ved å bruke en rePaint eller lignende metode (kommer an på hva slags løsning du bruker for GUI)

Lenke til kommentar

Jeg forsto det slik at du ville ha utskriften 012345678, slik at du fikk samme utskriften både med System.out.println og i tallfelt? Slik som det er nå vil tallfelt først inneholde 0, så i neste runde vil tallfelt inneholde 1, fordi 0 blir overskrevet. Skal du ha 0 1 2 3 4 5 6 7 8 til å vises i feltet må du først bygge opp en streng, så legge den inn i tallfelt. Hvis jeg nå har missforstått hva du vil må du presisere litt hva du faktisk vil ha som resultat.

Lenke til kommentar
Jeg forsto det slik at du ville ha utskriften 012345678, slik at du fikk samme utskriften både med System.out.println og i tallfelt? Slik som det er nå vil tallfelt først inneholde 0, så i neste runde vil tallfelt inneholde 1, fordi 0 blir overskrevet. Skal du ha 0 1 2 3 4 5 6 7 8 til å vises i feltet må du først bygge opp en streng, så legge den inn i tallfelt. Hvis jeg nå har missforstått hva du vil må du presisere litt hva du faktisk vil ha som resultat.

 

Sånn som det virker nå får jeg bare skrevet ut 8 tallet..

Jeg vil at hvert siffer skal stå like lenge som thread.sleep() er satt i textfeltet..

Lenke til kommentar
package eksempler_2008;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Skjerm extends JPanel{

static JFrame hovedvindu;

JPanel panel1;
JButton knapp1;
JButton knapp2;
JButton clear;
JButton pluss;
JButton erLik;

JTextField tallfelt;

boolean nyttTall;
int lagret_tall;

public Skjerm(){

	lagret_tall = 0;
	nyttTall = true;

	panel1 = new JPanel();
	panel1.setBackground(Color.green);

	knapp1 = new JButton("1");

	knapp2 = new JButton("2");
	pluss = new JButton ("+");
	erLik = new JButton ("=");
	clear = new JButton("clear");
	panel1.add(knapp1);
	panel1.add(knapp2);
	panel1.add(pluss);
	panel1.add(erLik);
	panel1.add(clear);
	add(panel1);

	tallfelt = new JTextField(15);
	panel1.add(tallfelt);
	ButtonHandler handler = new ButtonHandler();
	knapp1.addActionListener(handler);
	knapp2.addActionListener(handler);
	clear.addActionListener(handler);
	pluss.addActionListener(handler);
	erLik.addActionListener(handler);

}

private class ButtonHandler implements ActionListener{


	public void actionPerformed(ActionEvent event) {

		if (event.getSource()== knapp1 && nyttTall == true){
			tallfelt.setText("1");
			lagret_tall = 1;
			knapp1.setBackground(Color.cyan);

		}

		if (event.getSource() == knapp2){
			tallfelt.setText("2");
			lagret_tall = 2;
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


			knapp1.setBackground(Color.red);

		}
		if 	(event.getSource() == clear){
			tallfelt.setText("");
		}
		if (event.getSource() == pluss){
			addere();
		}
		if (event.getSource() == erLik){
			erlik();
		}
	}

}

public void erlik(){

	for ( int i = 0; i < 9; i++){
	String j = ""+(i);	
	tallfelt.repaint();
	tallfelt.setText(j);

	System.out.println(j);
	try {
		Thread.sleep(200);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	}
}

public void addere(){

	int minne;
	//6minne = lagret_tall
}

public static void main(String[] args) {


	hovedvindu = new JFrame("Skjerm");
	hovedvindu.add(new Skjerm());
	hovedvindu.pack();
	hovedvindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	hovedvindu.setVisible(true);

}

}

Lenke til kommentar

Problemet er at du bruker hendelsestråden til å eksekvere koden. Hvis du for eksempel tar en kort titt på repaint-metoden du kaller ser du at opptegninga forårsakes av:

Toolkit.getEventQueue().postEvent(e);

som vil si at din oppdatering av tekstfeltet vil vente til eksekveringen av erlik-metoden er fullført siden denne utføres i hendelsestråden (EventQueue).

 

For å løse dette trenger du en klasse som implementere Runnable (enten direkte eller indirekte via Thread-utviding). Lag så en ny tråd og i den tråden kjører du erlik-metoden.

 

Hvis du vil ha enkleste løsning skrevet ut er det kun tre små endringer:

1. Kall erlik-metoden for "run", altså:

public void run() {

2. Skrive "implements Runnable" i klassedefineringen, altså:

public class Skjerm extends JPanel implements Runnable {

3. For å eksekvere metoden i en ny tråd skriver du nå:

new Thread(Skjerm.this).start();

"Skjerm.this" kan byttes ut med "this" dersom du er i Skjerm-klassen (og ikke i en indre klasse av den), men "Skjerm.this" fungerer i begge tilfeller.

 

Du skal forresten ikke behøve å kalle på repaint()-metoden. En annen ting, dersom du til en annen gang er i tvil om hvilken tråd du eksekverer en kodedel i er det bare å skrive:

System.out.println(Thread.currentThread());

 

Enjoy :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...