SM-05-LAB-WIKI
Temat ćwiczenia
Stworzenie przykładowej aplikacji mobilnej w J2ME.
Wymagania
Wykonanie poprzedniego ćwiczenia.
Ćwiczenie
Stworzenie aplikacji
Celem ćwiczenia jest przygotowanie mobilnej aplikacji w języku Java (J2ME) dla telefonu komórkowego realizującej wizualizację równania kwadratowego o podanych przez użytkownika parametrach.
Utworzenie aplikacji rozpocząć możemy od przygotowania głównej formy programu.
Na początku definiujemy obszar wyświetlacza oraz formularz na którym umieścimy komponenty komunikacji z użytkownikiem:
private Display display; private Form form;
Definiujemy komponenty formularza, służące do wprowadzenia parametrów równania kwadratowego – TextField:
private TextField tf1 = new TextField("A:", "", 6, TextField.ANY);
private TextField tf2 = new TextField("B:", "", 6, TextField.ANY);
private TextField tf3 = new TextField("C:", "", 6, TextField.ANY);
W konstruktorze tworzymy obiekt formularza oraz dodajemy do niego zdefiniowane uprzednio komponenty:
display = Display.getDisplay(this);
form = new Form("Rownanie kwadratowe");
form.append(new String("Wprowadz parametry rownania kwadratowego:\n f(x) = Ax^2 + Bx + C"));
form.append(tf1);
form.append(tf2);
form.append(tf3);
W następnym kroku definiujemy obiekty odpowiedzialne za nawigację w aplikacji, która odbywa się poprzez posługiwanie się przez użytkownika klawiszami sterującymi telefonu:
private Command exitCommand = new Command("Wyjście", Command.SCREEN, 2);
private Command calculateCommand = new Command("Oblicz", Command.SCREEN, 1);
Umieszczamy utworzone obiekty na formularzu:
form.addCommand(exitCommand); form.addCommand(calculateCommand);
W kolejnym etapie definiujemy metodę obsługi naciśnięcia klawiszy:
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
if (c == calculateCommand) {
float A,B,C;
try {
A = Float.parseFloat(tf1.getString().equals("")?"0":tf1.getString());
B = Float.parseFloat(tf2.getString().equals("")?"0":tf2.getString());
C = Float.parseFloat(tf3.getString().equals("")?"0":tf3.getString());
} catch (Exception e) {
A=B=C=0;
}
display.setCurrent(new Wykres(form, display, (int)A, (int)B, (int)C));
}
}
Kompletny, przykładowy kod obsługi głównej formy aplikacji:
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
public class MojPierwszyMidlet extends MIDlet implements CommandListener {
private Command exitCommand = new Command("Wyjście", Command.SCREEN, 2);
private Command calculateCommand = new Command("Oblicz", Command.SCREEN, 1);
private Display display;
private Form form;
private TextField tf1 = new TextField("A:", "", 6, TextField.ANY);
private TextField tf2 = new TextField("B:", "", 6, TextField.ANY);
private TextField tf3 = new TextField("C:", "", 6, TextField.ANY);
public MojPierwszyMidlet() {
display = Display.getDisplay(this);
form = new Form("Rownanie kwadratowe");
form.append(new String("Wprowadz parametry rownania kwadratowego:\nf(x) = Ax^2 + Bx + C"));
form.append(tf1);
form.append(tf2);
form.append(tf3);
form.addCommand(exitCommand);
form.addCommand(calculateCommand);
form.setCommandListener(this);
}
public void startApp() {
display.setCurrent(form);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
if (c == calculateCommand) {
float A, B, C;
try {
A = Float.parseFloat(tf1.getString().equals("") ? "0" :
tf1.getString());
B = Float.parseFloat(tf2.getString().equals("") ? "0" : tf2.getString());
C = Float.parseFloat(tf3.getString().equals("") ? "0" : tf3.getString());
} catch (Exception e) {
A = B = C = 0;
}
display.setCurrent(new Wykres(form, display, (int)A, (int)B, (int)C));
}
}
}
W kolejnym kroku możemy przystąpić do utworzenia formy wyświetlającej wykres funkcji kwadratowej.
Przykładowy kod wizualizacji wykresu funkcji:
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Graphics;
public class Wykres extends Canvas implements CommandListener {
Form form;
Display display;
private Command backCommand = new Command("Wstecz", Command.SCREEN, 2);
// szerokość i długość ekranu
int ScreenWidth, ScreenHeight;
int A, B, C;
public Wykres(Form f, Display d, int a, int b, int c) {
display = d;
form = f;
A = a;
B = b;
C = c;
ScreenWidth = getWidth();
ScreenHeight = getHeight();
addCommand(backCommand);
setCommandListener(this);
}
protected void paint(Graphics g) {
// zmiana aktualnego koloru
g.setColor(0xffffff);
// namalowanie wypełnionego aktualnym kolorem prostokąta
g.fillRect(0, 0, ScreenWidth, ScreenHeight);
// zmiana aktualnego koloru
g.setColor(0x0);
g.drawLine(0, ScreenHeight / 2, ScreenWidth, ScreenHeight / 2);
g.drawLine(ScreenWidth / 2, 0, ScreenWidth / 2, ScreenHeight);
g.setColor(0xff0000);
int prevY = calcY(0 - ScreenWidth / 2);
int newY;
for (int k = 1; k < ScreenWidth; k++) {
newY = calcY(0 - ScreenWidth / 2 + k);
g.drawLine(k - 1, prevY + ScreenHeight/2, k, newY + ScreenHeight/2);
prevY = newY;
}
}
private int calcY(int x) {
return -(A * x * x + B * x + C);
}
public void commandAction(Command c, Displayable s) {
if (c == backCommand) {
display.setCurrent(form);
}
}
}
Zadanie
Napisać aplikację rysującą wybrane przez użytkownika figury geometryczne. Aplikacja ma umożliwiać użytkownikowi:
- wybór figury geometrycznej do narysowania (kwadrat, trójkąt, koło, romb, trapez),
- wybór liczby figur do narysowania,
- zdefiniowanie koloru tła, obramowania i wypełnienia figur.
Aplikację należy wzbogacić o mechanizm powiększania oraz zmniejszania wyświetlanej figury posługując się klawiszami funkcyjnymi telefonu.