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.