Gå til innhold

Oppdatere et JTextArea


Anbefalte innlegg

Har sittet i alt for mange timer med dette problemet og håper noen her er i stand til å se hva som er galt. Jeg har lagd ei klokke (kun med sekund foreløpig) som bruker et interface som en diskret link mellom gui og domene. Panelet som inneholder komponenten der tiden skal vises implementerer dette og definerer en metode som oppdaterer sekundvariablen. Hver gang det tikker printer det ut i terminalen 1,2,3,4.. men det vil ikke oppdateres i tekstfeltet.

 

Interfacet:

 

public interface Listener {

public void updateTime(Integer time);

}

 

Klokkepanelet:

 

public class ClockPanel extends JPanel implements Listener{

private Clock clock;
private Integer second;
private JTextArea clockNumbers;

public ClockPanel(Clock clock) {
	this.clock = clock;
	second = clock.getSecond().getValue();
	clockNumbers = new JTextArea();
	clockNumbers.setEditable(false);

	add(clockNumbers);
	setVisible(true);
}

public void updateTime(Integer time) {
	second = time;
	System.out.println(second.toString());
	clockNumbers.setText(second.toString());
}
}

 

Klokkeklassen:

 

public class Clock {

private ClockWork clockWork;
private static Listener listener;
private static Second second;
private static boolean running;

public Clock() {
	clockWork = new ClockWork();
	second = new Second();
	listener = new ClockPanel(this);
	running = true;

	Thread thread = new Thread(clockWork);
	thread.start();
}

public static void tic() {
	if(running == true) 
		second.ajustForward();
	listener.updateTime(second.getValue());
}

public Second getSecond() {
	return second;
}

public void setRunning(boolean running) {
	this.running = running;
}
}

 

Setter stor pris på alle svar, for er på grensen til å skalle hodet i en vegg for ideer.

Lenke til kommentar
Videoannonse
Annonse

Jeg vet ikke hvordan dette funker i awt, men du må kanskje kalle en metode for å tegne vinduet på nytt?

 

Edit: JTextArea har en repaint metode:

        public void updateTime(Integer time) {
               ...
               clockNumbers.repaint();
       }

Endret av Kiff
Lenke til kommentar

Takk så mye for svar:)

 

Det var virkelig et dytt i riktig retning. Jeg har lest og forstått mesteparten av teorien bak det, men sliter fortsatt litt med å skjønne hvor dette skal plasseres inn i koden. Jeg ser for meg det skal være i klokkeklassen, der SwingUtilities.invokelater(enRunnable) kjører listener.updateTime(second), men det ser ikke ut til å fungere.

 

Slik ser klokkeklassen ut nå:

 

public class Clock {

private Thread thread;
private ClockWork clockWork;
private static Listener listener;
private static Second second;
private static boolean running;

public Clock() {
	clockWork = new ClockWork();
	second = new Second();
	listener = new ClockPanel();
	running = true;

	thread = new Thread(clockWork);
	thread.start();
}

public static void tic() {
	[swingUtilities.invokeLater(new Runnable() {
	    public void run() {
		    listener.updateTime(second.getValue());
		    System.out.println(second.getValue().toString());
	    }
        });
	if(running == true) 
		second.ajustForward();
}

public Second getSecond() {
	return second;
}

public void setRunning(boolean running) {
	this.running = running;
}
}

 

updatetime:

 

public void updateTime(Integer time) {
	second = time;
	clockNumbers.setText(second.toString());
	System.out.println(clockNumbers.getText());
}

 

Klokka tikker og går fortsatt kun i terminalen, selv om jeg printer ut direkte fra clockNumbers. Verdien i feltet blir oppdatert, men fortsatt ikke det visuelle..

 

EDIT: Jeg implementerte Listener og definerte metoden i JFrame-klassen ved å hente frem tekstfeltet gjennom to sub-paneler. Nå oppdaterer vinduet seg, men jeg skjønner fortsatt ikke hvorfor det ikke fungerte med det foregående....

Endret av olemagro
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å
×
×
  • Opprett ny...