Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: J2ME: datefield, rms ja canvas-ongelmat

anssi [25.06.2005 00:00:18]

#

1. ongelma: miten saan tallennettua datefieldistä sen arvon muistiin rms:ään (persistent storageen) ja luettua sen sieltä takaisin datefieldiin? ei onnistu ihan simppelisti kun kyseessä on long-arvo.

2. miten saan canvaksen päivittymään looppina? tiedän että homma hoituu threadin, repaint():in ja callSerially():n avulla, mutta pukkaa erroria puuttuvista methodeista/muuttujista?


Tässä hieman canvaksen koodia:
-----------------------------

public class TestiCanvas extends Canvas implements Runnable {
    private Thread thread;

    public TestiCanvas() {
        start();
    }

    public void start() {
        thread = new Thread(this);
        thread.start();
    }

    public void paint(Graphics g) {
        g.setColor(0x000000);
        g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL));
        g.drawString("" + System.currentTimeMillis ()  + "", 0, Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL).getHeight(), Graphics.TOP | Graphics.LEFT);
    }

    public void run() {
        repaint();
        callSerially(this);
    }
}

anssi [25.06.2005 09:41:55]

#

Okei, sain ratkaistua ekan ongelman...

Tuo toinen on vielä ratkaisematta...

peran [27.06.2005 22:05:21]

#

Nop, nyt näin vähän vaivaa ja yritin vähillä J2ME taidoillani jotain saada aikaseksi.
Käsittääkseni se mitä olet hakemassa niin Demos esimerkeissä on hyvä esimerkki jatkuvasti päivitettävästä canvasista (Many Balls).

Muokkasin vähän esimerkkiäsi hieman erilaiseksi, jotta sain sen toimimaan. Ongelma esimerkissäsi on lineen myös se ettei se puhdista näyttöä ennen näyttöön kirjoittamista, joten se tekee vanhan näytön päälle vain jotain suttua. Joka tapauksessa sain sen toimimaan.
callSerially(this)-funktiota en löytänyt, joten jätin sen pois tästä toteutuksesta, ja korvasin sen while-silmukalla.

Tässä joka tapauksessa koodi, jonka sain toimiaan.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class TestiCanvas extends Canvas implements Runnable {
    private Thread thread;
    MIDlet parent;

    public TestiCanvas(MIDlet parent) {
	    this.parent = parent;
        start();

    }

    public void start() {
        thread = new Thread(this);
        Display d;
        d=Display.getDisplay(parent);
        d.setCurrent(this);
        thread.start();
    }

    public void paint(Graphics g) {
        g.setColor(0x000000);
        g.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL));
        g.drawString("" + System.currentTimeMillis ()  + "", 0, Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL).getHeight(), Graphics.TOP | Graphics.LEFT);
    }

    public void run() {
	    while (true) {
	    	repaint();
        	//callSerially(this); //???
		}
    }
}

Siis, onkohan tosta mitään apua?

anssi [27.06.2005 23:02:02]

#

Kiitos peran vastauksesta...
nyt ainakin päivittää jatkuvasti näyttöä niinkuin pitääkin.. tosin emulaattorin (7210 sdk) mukaan muistinkulutus on hirveää... muistia kuluu n.10-20kt sekunnissa...

peran [28.06.2005 01:07:14]

#

Muistinkulutusta vähentämään sen saa, kun päivittee vähemmän agressiivisesti (eli odottelee vähän aikaa ennen uutta päivitystä).

public void run() {
   while (true) {
      repaint();
      try {
         Thread.sleep(50); // 50 ms:ää odottaa
      } catch (InterruptedException e) {;}
   }
}

Kaipa tämä koodi toimii, vaikken testannutkaan sitä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta