{"id":532,"date":"2010-07-04T14:21:00","date_gmt":"2010-07-04T13:21:00","guid":{"rendered":"http:\/\/netrix.org.pl\/?p=532"},"modified":"2010-07-18T21:05:54","modified_gmt":"2010-07-18T20:05:54","slug":"java-2-micro-edition","status":"publish","type":"post","link":"https:\/\/netrix.org.pl\/index.php\/2010\/07\/04\/java-2-micro-edition\/","title":{"rendered":"Java 2 Micro Edition"},"content":{"rendered":"<p><a href=\"http:\/\/netrix.org.pl\/wp-content\/2010\/07\/oorrbgwmm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-537\" title=\"Java 2 Platform SDK\" src=\"http:\/\/netrix.org.pl\/wp-content\/2010\/07\/oorrbgwmm-300x166.png\" alt=\"\" width=\"300\" height=\"166\" srcset=\"https:\/\/netrix.org.pl\/wp-content\/2010\/07\/oorrbgwmm-300x166.png 300w, https:\/\/netrix.org.pl\/wp-content\/2010\/07\/oorrbgwmm-1024x569.png 1024w, https:\/\/netrix.org.pl\/wp-content\/2010\/07\/oorrbgwmm.png 1040w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>Tym razem b\u0119dzie troch\u0119 o programowaniu aplikacji na telefon kom\u00f3rkowy korzystaj\u0105c z platformy J2ME, co jak si\u0119 okazuje wcale nie jest takie trudne. Aby w og\u00f3le zacz\u0105\u0107 pisa\u0107 aplikacj\u0119 na t\u0119 platform\u0119 nale\u017cy zaopatrzy\u0107 si\u0119 w odpowiednie narz\u0119dzia. Praktycznie ka\u017cdy szanuj\u0105cy si\u0119 edytor do tworzenia aplikacji Javowych, umo\u017cliwia tworzenie projekt\u00f3w na urz\u0105dzenia mobilne. Ja jednak postanowi\u0142em p\u00f3j\u015b\u0107 po linii najmniejszego oporu i \u015bci\u0105gn\u0105\u0142em pakiet J2ME Platform SDK. Pakiet ten zawiera w sobie wszystko co jest potrzebne do pisania tego typu aplikacji (w tym niewielki edytor oparty na Netbeans). Mo\u017cna go znale\u017a\u0107 pod <a href=\"http:\/\/java.sun.com\/javame\/downloads\/index.jsp\" target=\"_blank\">tym linkiem<\/a>.<\/p>\n<p>Aplikacje J2ME nazywa si\u0119 Midletami, poniewa\u017c punktem startowym aplikacji jest klasa dziedzicz\u0105ca po interfejsie o tej nazwie. Interfejs ten wymusza implementacje 3 podstawowych funkcji:<\/p>\n<ul>\n<li><em>void startApp()<\/em><\/li>\n<li><em>void pauseApp()<\/em><\/li>\n<li><em>void destroyApp(boolean unconditional)<\/em><\/li>\n<\/ul>\n<p><a href=\"http:\/\/netrix.org.pl\/wp-content\/2010\/07\/vklgpcled.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-539\" title=\"Emulator\" src=\"http:\/\/netrix.org.pl\/wp-content\/2010\/07\/vklgpcled-136x300.png\" alt=\"\" width=\"136\" height=\"300\" \/><\/a>Pierwsza funkcja wywo\u0142ywana jest gdy aplikacja rozpoczyna lub wznawia dzia\u0142anie, w celu umo\u017cliwienia za\u0142adowania, zainicjalizowania odpowiednich danych. Druga funkcja umo\u017cliwia aplikacji zwolnienie cz\u0119\u015bci zasob\u00f3w w momencie gdy aplikacja przechodzi w stan wstrzymania. Ostatnia funkcja jest wywo\u0142ywana w momencie zamykania midletu. Funkcja ta posiada argument typu boolean, kt\u00f3ry okre\u015bla, czy aplikacja ma zosta\u0107 zamkni\u0119ta bezwarunkowo (w przeciwnym wypadku powinien zosta\u0107 rzucony odpowiedni wyj\u0105tek).<\/p>\n<p>Opr\u00f3cz tego dzia\u0142anie aplikacji opiera si\u0119 na kilku innych klasach: <em>Display<\/em>, <em>Command<\/em> oraz dziedzicz\u0105cych po klasie abstrakcyjnej <em>Displayable<\/em> &#8211; <em>Screen<\/em> lub <em>Canvas<\/em>. Klasa Display odpowiada za to co jest wy\u015bwietlane na ekranie, a wy\u015bwietlane s\u0105 obiekty klas pochodnych od klasy <em>Displayable<\/em>. Dodatkowo te obiekty mog\u0105 wysy\u0142a\u0107 r\u00f3\u017cne zdarzenia, czyli obiekty klasy <em>Command<\/em>. W celu rejestracji tych zdarze\u0144 potrzebny jest jeszcze obiekt klasy implementuj\u0105cej interfejs <em>CommandListener<\/em>, kt\u00f3ry nale\u017cy przekaza\u0107 do funkcji <em>Displayable::setCommandListener()<\/em>.<\/p>\n<p>Oto przyk\u0142adowy kod Hello World:<\/p>\n<pre lang=\"java\">package hello;\r\n\r\nimport javax.microedition.midlet.*;\r\nimport javax.microedition.lcdui.*;\r\n\r\npublic class HelloMIDlet extends MIDlet implements CommandListener\r\n{\r\n    private Command exitCommand; \/\/ The exit command\r\n    private Display display;     \/\/ The display for this MIDlet\r\n\r\n    public HelloMIDlet()\r\n    {\r\n        display = Display.getDisplay(this);\r\n        exitCommand = new Command(\"Exit\", Command.EXIT, 0);\r\n    }\r\n\r\n    public void startApp()\r\n    {\r\n        TextBox t = new TextBox(\"Hello\", \"Hello, World!\", 256, 0);\r\n\r\n        t.addCommand(exitCommand);\r\n        t.setCommandListener(this);\r\n\r\n        display.setCurrent(t);\r\n    }\r\n\r\n    public void pauseApp()\r\n    {\r\n    }\r\n\r\n    public void destroyApp(boolean unconditional)\r\n    {\r\n    }\r\n\r\n    public void commandAction(Command c, Displayable s)\r\n    {\r\n        if (c == exitCommand)\r\n        {\r\n            destroyApp(false);\r\n            notifyDestroyed();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Jak wida\u0107 te kilka klas wystarcza, aby utworzy\u0107 prost\u0105 aplikacj\u0119 na telefon kom\u00f3rkowy. Bardziej z\u0142o\u017cone korzystaj\u0105 dodatkowo z RecordStore do zapisywania informacji mi\u0119dzy r\u00f3\u017cnymi uruchomieniami aplikacji oraz kilku innych.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tym razem b\u0119dzie troch\u0119 o programowaniu aplikacji na telefon kom\u00f3rkowy korzystaj\u0105c z platformy J2ME, co jak si\u0119 okazuje wcale nie jest takie trudne. Aby w og\u00f3le zacz\u0105\u0107 pisa\u0107 aplikacj\u0119 na t\u0119 platform\u0119 nale\u017cy zaopatrzy\u0107 si\u0119 w odpowiednie narz\u0119dzia. Praktycznie ka\u017cdy szanuj\u0105cy si\u0119 edytor do tworzenia aplikacji Javowych, umo\u017cliwia tworzenie projekt\u00f3w na urz\u0105dzenia mobilne. Ja jednak [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[115,182,113,114],"_links":{"self":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/532"}],"collection":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=532"}],"version-history":[{"count":11,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/532\/revisions"}],"predecessor-version":[{"id":543,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/532\/revisions\/543"}],"wp:attachment":[{"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}