[J2ME] Problem ze zmiennymi typu Date


(system) #1

Witam

Mam nietypowy problem ze zmiennymi typu Date. Problem pojawia się, gdy uruchamiam middlet na telefonie, który nie posiada zgodności z MIDP 2.1 (np. Nokia 3310 Classic, SE 550).

Natomiast na emulatorze i telefonie z MIDP2.1 (np. Nokia E52) wszystko działa OK.

Problem polega na tym, że wartości zmiennych nadpisują się i wszystkie zmienne na telefonach z MIDP 2.0 mają tą samą wartość.

Przykładowy program:

import java.util.*;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*; 


public class Daty extends MIDlet implements CommandListener{


Command koniec;


private String fData(Date D)

	{

	String RRRR, MM, DD;

	Calendar K = Calendar.getInstance();

    K.setTime(D);

	int rok = K.get(Calendar.YEAR);

	int mies = K.get(Calendar.MONTH)+1;

	int dzien = K.get(Calendar.DAY_OF_MONTH);

	RRRR = "" + rok;

	if (mies < 10)

		{

		MM = "0" + mies;

		}

	else

		{

		MM = "" + mies;

		}

	if (dzien < 10)

		{

		DD = "0" + dzien;

		}

	else

		{

		DD = "" + dzien;

		}

	return new String(DD + "." + MM + "." + RRRR);

	}


public void startApp()

	{

	final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;

	Display dis;

	Form fF;

	dis = Display.getDisplay(this);

	fF = new Form("Daty");


	koniec=new Command("Koniec",Command.EXIT,0);

	fF.addCommand(koniec);


	//Date dzis;

	Calendar tKal = Calendar.getInstance();

	Date Dzis = new Date();

	tKal.setTime(Dzis);

	tKal.set(Calendar.HOUR_OF_DAY, 0);

	tKal.set(Calendar.MINUTE, 0);

	tKal.set(Calendar.SECOND, 0);

	tKal.set(Calendar.MILLISECOND, 0);

	Dzis = tKal.getTime();


	StringItem s10=new StringItem(null, "Dzis= " + fData(Dzis));

	fF.append(s10);

	Spacer przerwa10=new Spacer(fF.getWidth(),1);

	fF.append(przerwa10);


	long ltKal = Dzis.getTime();

	ltKal -= MILLIS_PER_DAY;

	tKal.setTime(new Date(ltKal));

	Date Wczoraj = new Date();

	Wczoraj = tKal.getTime();


	StringItem s11=new StringItem(null, "Wczoraj= " + fData(Wczoraj));

	fF.append(s11);

	Spacer przerwa11=new Spacer(fF.getWidth(),1);

	fF.append(przerwa11);


	ltKal += 2L * MILLIS_PER_DAY;

	tKal.setTime(new Date(ltKal));

	Date Jutro = new Date();

	Jutro = tKal.getTime();


	StringItem s12=new StringItem(null, "Jutro= " + fData(Jutro));

	fF.append(s12);

	Spacer przerwa12=new Spacer(fF.getWidth(),1);

	fF.append(przerwa12);


	StringItem s13=new StringItem(null, "A może tak:");

	fF.append(s13);

	Spacer przerwa13=new Spacer(fF.getWidth(),1);

	fF.append(przerwa13);


	StringItem s0=new StringItem(null, "Dzis= " + fData(Dzis));

	fF.append(s0);

	Spacer przerwa0=new Spacer(fF.getWidth(),1);

	fF.append(przerwa0);

	StringItem s1=new StringItem(null, "Wczoraj= " + fData(Wczoraj));

	fF.append(s1);

	Spacer przerwa1=new Spacer(fF.getWidth(),1);

	fF.append(przerwa1);

	StringItem s2=new StringItem(null, "Jutro= " + fData(Jutro));

	fF.append(s2);


	fF.setCommandListener(this);	

	dis.setCurrent(fF);	

	}


public void pauseApp(){}


public void destroyApp(boolean b){}


public void commandAction(Command c,Displayable d)

	{

	notifyDestroyed();

	}

}

Program ten uruchomiony na emulatorze da następujący wynik:

Dzis= 07.07.2011

Wczoraj= 06.07.2011

Jutro= 08.07.2011

A może tak:

Dzis= 07.07.2011

Wczoraj= 06.07.2011

Jutro= 08.07.2011

Natomiast uruchamiając program na komórce z MIDP2.0 zobaczymy:

Dzis= 07.07.2011

Wczoraj= 06.07.2011

Jutro= 08.07.2011

A może tak:

Dzis= 08.07.2011

Wczoraj= 08.07.2011

Jutro= 08.07.2011

Middlet kompiluję JWTK v2.5.2 z ustawionym MIDP 2.0 i CLDC 1.1. Być może problem ten wynika z mojego błędu, nie jestem zawodowym programistą. Proszę o pomoc, jak można rozwiązać ten problem. -- Dodane 11.07.2011 (Pn) 8:11 -- Witam ponownie. Udało mi się rozwiązać ten problem, chociaż jest to raczej rozwiązanie z gatunku "protez". Ale działa :slight_smile: Po prostu dla każdej zmiennej typu Date utworzyłem oddzielny obiekt typu Calendar. Teraz wynik działania midletu zarówno na emulatorze, jak i na komórkach typu SE550, Samsung Avila jest prawidłowy. Jednak nie jest eleganckie rozwiązanie. Może znajdzie się na forum osoba, która podsunie coś lepszego? Poniżej zmodyfikowany kod middletu:

import java.util.*;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*; 


public class Daty extends MIDlet implements CommandListener{


Command koniec;


private String fData(Date D)

	{

	String RRRR, MM, DD;

	Calendar K = Calendar.getInstance();

    K.setTime(D);

	int rok = K.get(Calendar.YEAR);

	int mies = K.get(Calendar.MONTH)+1;

	int dzien = K.get(Calendar.DAY_OF_MONTH);

	RRRR = "" + rok;

	if (mies < 10)

		{

		MM = "0" + mies;

		}

	else

		{

		MM = "" + mies;

		}

	if (dzien < 10)

		{

		DD = "0" + dzien;

		}

	else

		{

		DD = "" + dzien;

		}

	return new String(DD + "." + MM + "." + RRRR);

	}


public void startApp()

	{

	final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000L;

	Display dis;

	Form fF;

	dis = Display.getDisplay(this);

	fF = new Form("Daty");


	koniec=new Command("Koniec",Command.EXIT,0);

	fF.addCommand(koniec);


	//Date dzis;

	Calendar tKal = Calendar.getInstance();

	Date Dzis = new Date();

	tKal.setTime(Dzis);

	tKal.set(Calendar.HOUR_OF_DAY, 0);

	tKal.set(Calendar.MINUTE, 0);

	tKal.set(Calendar.SECOND, 0);

	tKal.set(Calendar.MILLISECOND, 0);

	Dzis = tKal.getTime();


	StringItem s10=new StringItem(null, "Dzis= " + fData(Dzis));

	fF.append(s10);

	Spacer przerwa10=new Spacer(fF.getWidth(),1);

	fF.append(przerwa10);


	long ltKal = Dzis.getTime();

	ltKal -= MILLIS_PER_DAY;

	Calendar tKal2 = Calendar.getInstance();

	tKal2.setTime(new Date(ltKal));

	Date Wczoraj = new Date();

	Wczoraj = tKal2.getTime();


	StringItem s11=new StringItem(null, "Wczoraj= " + fData(Wczoraj));

	fF.append(s11);

	Spacer przerwa11=new Spacer(fF.getWidth(),1);

	fF.append(przerwa11);


	ltKal += 2L * MILLIS_PER_DAY;

	Calendar tKal3 = Calendar.getInstance();

	tKal3.setTime(new Date(ltKal));

	Date Jutro = new Date();

	Jutro = tKal3.getTime();


	StringItem s12=new StringItem(null, "Jutro= " + fData(Jutro));

	fF.append(s12);

	Spacer przerwa12=new Spacer(fF.getWidth(),1);

	fF.append(przerwa12);


	StringItem s13=new StringItem(null, "A może tak:");

	fF.append(s13);

	Spacer przerwa13=new Spacer(fF.getWidth(),1);

	fF.append(przerwa13);


	StringItem s0=new StringItem(null, "Dzis= " + fData(Dzis));

	fF.append(s0);

	Spacer przerwa0=new Spacer(fF.getWidth(),1);

	fF.append(przerwa0);

	StringItem s1=new StringItem(null, "Wczoraj= " + fData(Wczoraj));

	fF.append(s1);

	Spacer przerwa1=new Spacer(fF.getWidth(),1);

	fF.append(przerwa1);

	StringItem s2=new StringItem(null, "Jutro= " + fData(Jutro));

	fF.append(s2);


	fF.setCommandListener(this);	

	dis.setCurrent(fF);	

	}


public void pauseApp(){}


public void destroyApp(boolean b){}


public void commandAction(Command c,Displayable d)

	{

	notifyDestroyed();

	}

}