olemagro Skrevet 20. september 2011 Del Skrevet 20. september 2011 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
Kiff Skrevet 20. september 2011 Del Skrevet 20. september 2011 (endret) 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 20. september 2011 av Kiff Lenke til kommentar
Hieronymus Skrevet 20. september 2011 Del Skrevet 20. september 2011 Problemet er at du prøver å forandre state på en komponent utenfor event-dispatc-tråden. Istedet for å komme med løsningen, vil jeg heller dytte deg i riktig retning http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html#event_dispatching Lenke til kommentar
olemagro Skrevet 21. september 2011 Forfatter Del Skrevet 21. september 2011 (endret) 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 21. september 2011 av olemagro Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå