t0bbi Skrevet 16. november 2008 Del Skrevet 16. november 2008 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
NevroMance Skrevet 16. november 2008 Del Skrevet 16. november 2008 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. Lenke til kommentar
t0bbi Skrevet 16. november 2008 Forfatter Del Skrevet 16. november 2008 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
HolgerL Skrevet 16. november 2008 Del Skrevet 16. november 2008 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
NevroMance Skrevet 16. november 2008 Del Skrevet 16. november 2008 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
t0bbi Skrevet 16. november 2008 Forfatter Del Skrevet 16. november 2008 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
pgdx Skrevet 16. november 2008 Del Skrevet 16. november 2008 Tror du må paste hele klassen din, inkludert hvilke type tallfelt er. Og gjør det i kodeblokker: Lenke til kommentar
t0bbi Skrevet 16. november 2008 Forfatter Del Skrevet 16. november 2008 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
gunnard Skrevet 17. november 2008 Del Skrevet 17. november 2008 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
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å