INSTRUKCJA DO ĆWICZENIA 1 PIERWSZA APLIKACJA W JAVIE NA TELEFON KOMÓRKOWY INTERFEJS WYSOKIEGO POZIOMU KLASY SCREEN



Podobne dokumenty
SCHEMATY STRON. Baner Nawigacja Nawigacja okruszkowa Prawa kolumna zobacz również Boksy Zwykła strona...

Moduł Pulpit opcji oraz Narzędzia. Opis v 1.0

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Certyfikaty Certum Podpis w Adobe Reader

VinCent Office. Moduł Drukarki Fiskalnej

Laboratorium z informatyki sem. III/ćw.11 Wydział Transportu PW 2017/18

Laboratorium z informatyki sem. III/ćw.12 Wydział Transportu PW 2018/19

Arkusz kalkulacyjny MS Excel podstawy

dbsamples.udl lub przygotowany wcześniej plik dla Excela) i OK,

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

Opis zmian funkcjonalności platformy E-GIODO wprowadzonych w związku z wprowadzeniem możliwości wysyłania wniosków bez podpisu elektronicznego

Pracownia internetowa w każdej szkole. Opiekun pracowni internetowej SBS 2003 PING

Opis obsługi systemu Ognivo2 w aplikacji Komornik SQL-VAT

Java Platform Micro Edition

emszmal 3: Automatyczne księgowanie przelewów w menedżerze sprzedaży BaseLinker (plugin dostępny w wersji ecommerce)

BL20 New Chocolate. Wiadomości Tu i Teraz. Ustawienie. Aktywacja. Wyłączenie. Kanał 50 - Gdzie jestem. Aktywacja / Wyłączenie

INSTRUKCJA Panel administracyjny

REJESTRATOR RES800 INSTRUKCJA OBSŁUGI

SINAMICS G120C STARTER. Tworzenie nowego projektu w trybie offline.

Przeniesienie lekcji SITA z płyt CD na ipoda touch

Konfigurator opisuje proces instalacji i konfiguracji karty sieciowej bezprzewodowej D-Link DWL-520+ w systemach /2000/XP /

elektroniczna Platforma Usług Administracji Publicznej

Głośnik HP Roar Plus. Inne funkcje

STRONA GŁÓWNA SPIS TREŚCI. Zarządzanie zawartością stron... 2 Tworzenie nowej strony... 4 Zakładka... 4 Prawa kolumna... 9

Rozliczenia z NFZ. Ogólne założenia. Spis treści

Instrukcja instalacji oraz wykorzystania podpisu cyfrowego

Połączenie VPN Host-LAN IPSec z wykorzystaniem Windows XP. 1. Konfiguracja serwera VPN. 2. Konfiguracja klienta VPN. 3. Zainicjowanie połączenia

PERSON Kraków

emszmal 3: Eksport wyciągów do Subiekt (Su\Re\Ra) nexo (plugin dostępny wraz z dodatkiem Biznes)

public void startapp() { } public void pauseapp() { } public void destroyapp(boolean unconditional) { }

Zarządzanie Zasobami by CTI. Instrukcja

emszmal 3: Automatyczne księgowanie przelewów w sklepie internetowym Magento (plugin dostępny w wersji ecommerce)

Kalkulator Kalorii by CTI. Instrukcja

Użytkowanie elektronicznego dziennika UONET PLUS.

Wtedy wystarczy wybrać właściwego Taga z listy.

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 1

Rachunek_UCP. C e l. Zarejestrowanie rachunku do umowy cywilnoprawnej w systemie SAP. Wymagania wstępne

INSTRUKCJA DO PROGRAMU LICZARKA 2000 v 2.56

Tekst ozdobny i akapitowy

Specyfikacja techniczna banerów Flash

INSTRUKCJA PROGRAMU BHM SPIS TREŚCI

Zdalne odnawianie certyfikatów do SWI

INSTRUKCJA WebPTB 1.0

Konfiguracja programu Outlook 2007 do pracy z nowym serwerem poczty (Exchange)

Ramki tekstowe w programie Scribus

np. tu - na pierwszej formatce kreatora zaznaczamy opcję nr 3

Wykład 4 Wybrane zagadnienia programowania w C++

GEO-SYSTEM Sp. z o.o. GEO-RCiWN Rejestr Cen i Wartości Nieruchomości Podręcznik dla uŝytkowników modułu wyszukiwania danych Warszawa 2007

Zmiany w programie C GEO v. 6.5

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

DEMERO Automation Systems

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Instrukcja wprowadzania danych do formularza importowego edziennika MobiReg wersja Light v.1.1

Instrukcja instalacji programu Plantator oraz transferu pliku danych z/do PC kolektor danych PT-20

Ashampoo Rescue Disc

3S TeleCloud - Aplikacje Instrukcja użytkowania usługi 3S KONTAKTY

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

PODRĘCZNIK UŻYTKOWNIKA

Aplikacje internetowe i rozproszone - laboratorium

CELAB. System Informatyczny. Punkt przyjęć krok po kroku LTC 1

Spis treści. Rozdział 1 ewyniki. mmedica - INSTR UKC JA UŻYTKO W NIKA

Instrukcja aplikacji R-Quick

I. Zakładanie nowego konta użytkownika.

Ekran startowy płyty instalacyjnej umozliwia nam wybór

INSTRUKCJA KORZYSTANIA Z ELEKTRONICZNEJ ŚCIEŻKI WYKAZÓW

CitiDirect Online Banking. Powiadomienia

Programowanie Podstawowe Informacje

Pierwsze kroki. Krok 1. Uzupełnienie danych własnej firmy

Platforma Aukcyjna Marketplanet. Podręcznik Oferenta. Aukcja dynamiczna zniŝkowa

Parowanie urządzeń Bluetooth. Instrukcja obsługi

Instrukcja obsługi. Oprogramowanie SAS 31

Nowe funkcjonalności

INFORMATOR TECHNICZNY WONDERWARE

Archiwum Prac Dyplomowych

Konfiguracja przeglądarek internetowych oraz Panelu Java dla klientów instutucjonalnych problemy z apletem do logowania/autoryzacji

Jak spersonalizować wygląd bloga?

Spring MVC Andrzej Klusiewicz 1/18

INSTRUKCJA DO INTERNETOWEGO ROZKŁADU JAZDY

Kurier POCZTEX XL by CTI. Instrukcja

Wdrożenie modułu płatności eservice dla systemu Virtuemart 2.0.x

Instrukcja. 1 Zamawiając kuriera. W Paczkomacie lub POK. 3 Nadając list polecony. nadawania przesyłek z Allegro: (Punkt Obsługi Klienta)

WPROWADZENIE. 2. Microsoft PowerPoint program, w którym powstanie prezentacja multimedialna

SINAMICS G120C STARTER. Tworzenie nowego projektu w trybie online.

Symfonia Produkcja Instrukcja instalacji. Wersja 2013

Laboratorium 14: Bazy Danych Konstruowanie interfejsu dla prostej bazy danych wykorzystującą technologię dbexpress

STWORZENIE PRZYKŁADOWEJ

Obsługa pakietu biurowego OFFICE

Okna rysunkowe: rzutnie (VPORTS) RZUTNIE _VPORTS

Zaznaczając checkbox zapamiętaj program zapamięta twoje dane logowania. Wybierz cmentarz z dostępnych na rozwijalnej liście.

SKRÓCONA INSTRUKCJA OBSŁUGI ELEKTRONICZNEGO BIURA OBSŁUGI UCZESTNIKA BADANIA BIEGŁOŚCI

Miejski System Zarządzania - Katowicka Infrastruktura Informacji Przestrzennej

e-dziekanat Instrukcja użytkownika dydaktyk

Program Płatnik Instrukcja instalacji

BCS Manager Instrukcja Obsługi

Zmiany w wersji 1.18 programu VinCent Office.

1. Korzyści z zakupu nowej wersji Poprawiono Zmiany w słowniku Stawki VAT Zmiana stawki VAT w kartotece Towary...

Microsoft Management Console

Podstawy pracy w arkuszu kalkulacyjnym MS Excel

Transkrypt:

I INSTRUKCJA DO ĆWICZENIA 1 PIERWSZA APLIKACJA W JAVIE NA TELEFON KOMÓRKOWY INTERFEJS WYSOKIEGO POZIOMU KLASY SCREEN Tworzenie pierwszego MIDletu przy pomocy środowiska NetBeans. 1. Otwórz nowy projekt w środowisku NetBeans, wybierając z menu File opcję New Project a następnie zaznacz w panelu Categories: Java ME, w panelu Project: Mobile Application. Naciśnij przycisk Next >. 2. Projekt nazwij JME-Pierwszy. Określ położenie projektu Project Location: przyciskiem Browse wybierając folder Z:\ 3. Koniecznie usuń zaznaczenie opcji Create Default Package and Main Executable Class (patrz poniżej. 4. Naciśnij przycisk Next >. 5. W trzecim kroku tworzenia nowego projektu w nowym oknie New Mobile Application, wybierz w okienku dialogowym Emulator Platform: Oracle Java Platform Micro Edition SDK 3.3, następnie sprawdź, czy ustawienia: typ urządzenia, konfiguracji i profili są zgodne z tym pokazanym na rysunku wyżej (JavaMEPhone1, CLDC-1.1, MIDP-2.1) jeśli tak, naciśnij przycisk Finish. 6. W okienku Projects kliknij nazwę projektu JME-Pierwszy prawym przyciskiem myszy a następnie wybierz opcję New i dalej w otwartym oknie dialogowym wybierz MIDlet. 7. Zmień nazwę MIDlet Name: na MidletKlasyScreen. Naciśnij przycisk Finish. 8. W okienku Projects kliknij dwukrotnie nazwę midletu MidletKlasyScreen, w oknie edytora kodu zostanie otwarty do edycji plik MidletKlasyScreen.java. II Podstawowy szkielet MIDetu opis podstawowych wymagań 1. Nasz wygenerowany program powinien mieć następującą postać (pominięto komentarze): import javax.microedition.midlet.*; public class MidletKlasyScreen extends MIDlet { public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { Uzasadnienie - deklaracja koniecznych metod Dziedziczenie po klasie MIDlet zobowiązuje nas do zdefiniowania trzech metod, które w klasie MIDlet zostały oznaczone jako abstrakcyjne. Metody abstrakcyjne nie zawierają żadnej treści i zmuszają programistów tworzących klasy pochodne do samodzielnego ich zdefiniowania. Metody abstrakcyjne, o których mowa, to: public void startapp() public void pauseapp() public void destroyapp(boolean unconditional) Są one bezpośrednio związane ze stanem, w jakim znajduje się MIDlet. W momencie uruchamiania aplikacji wywołana zostaje metoda startapp(). Jeśli chcemy zwolnić zaalokowane wcześniej zasoby, możemy użyć metody destroyapp() przed zakończeniem działania aplikacji. Metoda pauseapp() zostaje wywołana w chwili, gdy ktoś dzwoni i telefon musi zająć się obsługą rozmowy. 2. Za deklaracją klasy głównej MIDletKlasyScreen a przed metodą startapp() wygeneruj automatycznie konstruktora klasy. W tym celu należy wykonać następujące czynności: Ustaw kursor myszy w wierszu 12. Kliknij prawym przyciskiem myszy w pustym 12 wierszu i z menu podręcznego wybierz opcję Insert Code Następnie w oknie Generate kliknij opcję Constructor, zostanie automatycznie wygenerowany kod konstruktora klasy MIDletKlasyScreen public MIDletKlasyScreen() { Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 1

III Projektowanie wyglądu interfejsu wysokiego poziomu 1. Przed konstruktorem wpisz instrukcję, która zadeklaruje istnienie ekranu klasy Form o nazwie formatka: Form formatka = new Form("Pierwszy MIDlet"); Z uwagi, iż używamy nazwy klasy Form po raz pierwszy, musimy zaimportować odpowiednią bibliotekę do naszego MIDletu następująco; wystarczy kliknąć prawym przyciskiem myszy wewnątrz okna edytora kodu i wybrać z menu podręcznego opcję Fix Imports, automatycznie zostanie dodana na górze programu w odpowiednim miejscu instrukcja import javax.microedition.lcdui.form; 2. Obiekt klasy Display jest logiczną reprezentacją ekranu telefonu komórkowego. Każdy MIDlet ma dedykowany dokładnie jeden taki obiekt i należy pozyskać referencję do niego poprzez wywołanie metody: getdisplay(). Aby to wykonać utwórzmy obiekt typu Display o nazwie display (przed konstruktorem w tzw. publicznej części klasy) następująco: Display display; Czy pamiętałeś o Fix Imports? 3. Teraz musimy przechować referencję do tego obiektu poprzez wywołanie metody getdisplay(). W tym przypadku najlepiej wpisać taką instrukcję w metodzie startapp(), ponieważ ta metoda zostanie wykonana automatycznie zaraz po uruchomieniu midletu. display = Display.getDisplay(this); 4. Wyświetlimy na naszym ekranie tekst Witamy społeczność akademicką! Najłatwiej tego dokonać wpisując na końcu w konstruktorze głównej klasy instrukcję, która doda do ekranu o nazwie formatka tekst: formatka.append("witamy społeczność akademicką!"); 5. Uruchom aplikację naciskając klawisz <F6>. Kursor myszy powinien być umieszczony w oknie edytora kodu. Powinien pojawić się ekran pokazany poniżej: 6. Zamknij emulator przyciskiem znajdującym się w prawym górnym narożniku okna. 7. Przyczyną takiego stanu rzeczy jest brak ustalenia, jaki ekran (obiekt) ma być wyświetlany na display (ekranie telefonu). W tym przypadku należy wpisać instrukcję w metodzie startapp(), która określi że, aktualnie wyświetlanym obiektem ma być ekran o nazwie formatka. 8. Uruchom aplikację. display.setcurrent(formatka); IV Zamknięcie aplikacji poleceniem Command W programach pisanych na telefony komórkowe nie uświadczymy tradycyjnych przycisków (Button), ich funkcje doskonale spełniają polecenia (Command). Na ekranie znajdują się one nad przyciskami opcji i to właśnie te przyciski wywołują polecenia. Po utworzeniu odpowiedniego polecenia trzeba je jeszcze dodać do formatki. Zmodyfikuj tak program, aby po wypisaniu tekstu na ekranie zamknięcie aplikacji nastąpiło po wybraniu opcji ZAMKNIJ 1. Jeśli więc chcemy operować komendami (poleceniami) w naszej aplikacji, jedna z naszych klas musi implementować interfejs CommandListener. Zatem dodaj do klasy MIDletKlasyScreen interfejs CommandListener, który pozwoli nam operować komendami obsługujące przyciski opcji. W tym celu zmień istniejący nagłówek klasy MIDletKlasyScreen do postaci public class MIDletKlasyScreen extends MIDlet implements CommandListener{ 2. Z uwagi, iż używamy nazwy klasy CommandLstener, musimy zaimportować odpowiednią bibliotekę do naszego MIDletu następująco; wystarczy kliknąć prawym przyciskiem myszy wewnątrz okna edytora kodu i wybrać z menu podręcznego opcję Fix Imports, automatycznie zostanie dodana w odpowiednim miejscu instrukcja import javax.microedition.lcdui.commandlistener; 3. Określenie obiektu słuchacza zdarzeń, który implementuje interfejs CommandListener wymaga także zdefiniowania metody commandaction(); którą w naszym przypadku umieścimy za metodą destroyapp(). I w tym przypadku wygenerujemy ją automatycznie, następująco: Wstaw pusty wiersz za metodą destroyapp Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 2

Kliknij prawym przyciskiem myszy w tym pustym wierszu i z menu podręcznego wybierz opcję Insert Code Następnie w oknie Generate kliknij opcję Implement Metod zostanie wyświetlone okno dialogowe Generate Implement Methods, w którym należy zaznaczyć opcję dla węzła CommandListener, a następnie kliknąć przycisk Generate. Automatycznie zostanie wygenerowany kod metody commandaction, w której należy usunąć w całości instrukcję throw new UnsupportedOperationException("Not supported yet."); //To change body of Ten fragment kodu programu powinien wyglądać następująco: public void commandaction(command cmnd, Displayable dsplbl) { 4. Dodawanie polecenia ZAMKNIJ (zakończenie działania aplikacji) do MIDletu. Dodaj poniższą instrukcję przed konstruktorem klasy MIDletKlasyScreen Command wyjscie = new Command("ZAMKNIJ", Command.EXIT,1); 5. Wewnątrz konstruktora klasy MIDletKlasyScreen dopisz instrukcje dodające komendę // dodaj komendę formatka.addcommand(wyjscie); 6. Włącz nasłuchiwanie zdarzeń z ekranu dopisując poniższą instrukcję w metodzie startapp(): formatka.setcommandlistener(this); 7. W metodzie commandaction() możemy rozpoznać wywołaną komendę i aktywny ekran Displayable i odpowiednio na nią zareagować. public void commandaction(command cmnd, Displayable dsplbl) { if (cmnd == wyjscie) { destroyapp(true); notifydestroyed(); 8. Uruchom aplikację <F6> lub przyciskiem. 9. Sprawdź działanie polecenia ZAMKNIJ. Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 3

V DRUGA APLIKACJA W JAVIE NA TELEFON KOMÓRKOWY INTERFEJS NISKIEGO POZIOMU KLASY CANVAS Tworzenie drugiego MIDletu przy pomocy środowiska NetBeans. 1. Otwórz nowy projekt typu Mobile Application o nazwie JME-Drugi na dysku Z:\ Nadaj nazwie MIDletu nazwę MidletKlasyCanvas. Czynności wykonaj zgodnie z niniejszą instrukcją począwszy od pkt. I.1 do pkt. II.1 włącznie. VI Podstawowy szkielet MIDetu projektowanie wyglądu interfejsu niskiego poziomu 1. Wygeneruj automatycznie konstruktora klasy MIDletKlasyCanvas (patrz pkt: II.2). 2. Zbudujmy wewnętrzną klasę EkranG rozszerzającą klasę Canvas, zaraz na końcu klasy MIDletKlasyCanvas. Zatem umieść dokładnie w tym samym miejscu poniższy kod wyróżniony szarym tłem: import javax.microedition.midlet.*; Publiczna część klasy MIDletKlasyCanvas Publiczna część klasy EkranG public class MIDletKlasyCanvas extends MIDlet { public MIDletKlasyCanvas() { Konstruktor klasy MIDletKlasyCanvas public void startapp() { public void pauseapp() { public void destroyapp(boolean unconditional) { private class EkranG extends Canvas { Konstruktor klasy EkranG public EkranG(String txtlab){ protected void paint(graphics g){ Pamiętaj o dodaniu odpowiednich bibliotek (Fix Imports) 3. Dokonaj przeformatowania kodu programu <Alt+Shift+F>. (lub kliknij prawym przyciskiem wewnątrz edytora kodu i wybierz opcję Format.) 4. W publicznej części klasy EkranG umieść deklaracje trzech zmiennych: String etykieta = "Tekst domyślny"; //tekst do wypisania na ekranie int szerokośćekranu, wysokośćekranu; //szerokość i wysokość ekranu 5. W konstruktorze klasy EkranG umieść poniższą instrukcję: etykieta = txtlab; 6. Na początku metody paint() wpisz instrukcje: //Pobieram wysokość i szerokość dostępnego ekranu szerokośćekranu = getwidth(); wysokośćekranu = getheight(); 7. Wygląd naszego ekranu zdefiniujemy w metodzie paint(), zatem uzupełnij jej treść następująco: //Malowanie tła g.setcolor(255, 255, 0);//zmiana aktualnego koloru //Namalowanie wypełnionego aktualnym kolorem prostokąta g.fillrect(0, 0, szerokośćekranu, wysokośćekranu); //Wyświetlenie współrzędnych lewego górnego narożnika ekranu g.setcolor(0, 0, 0); g.drawstring("(0,0)", 0, 0, Graphics.TOP Graphics.LEFT); //Wyświetlenie współrzędnych prawego dolnego narożnika ekranu g.drawstring("(" + szerokośćekranu + "," + wysokośćekranu + ")", szerokośćekranu, wysokośćekranu, Graphics.BOTTOM Graphics.RIGHT); //Tekst na środku ekranu g.setcolor(0,0,255); g.drawstring(etykieta, szerokośćekranu / 2, wysokośćekranu / 2, Graphics.BASELINE Graphics.HCENTER); Zbudowaliśmy klasę wewnętrzną EkranG dziedziczącą z Canvas. 8. Aby zobaczyć efekty naszej pracy, musimy stworzyć logiczną reprezentację ekranu. Wykonaj tą czynność samodzielnie (patrz. pkt.iii.2 i III.3). 9. W publicznej części klasy MIDletKlasyCanvas zadeklaruj zmienną, która będzie wskazywać na obiekty klasy EkranG następująco: EkranG ekrang; Natomiast w konstruktorze tej klasy dopisz instrukcję (konstruktor powinien zostać utworzony po wykonaniu pkt. II.2). ekrang = new EkranG("JME i Canvas rządzi"); Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 4

10. Uzupełnij treść metody startapp() następująco: 11. Uruchom program <F6>. display.setcurrent(ekrang); 12. Zmodyfikuj samodzielnie tak program, aby zamknięcie aplikacji nastąpiło po wybraniu opcji z napisem KONIEC. (Zastanów się gdzie umieścić odpowiednie instrukcje). VII Wyświetlanie plików graficznych na płótnie (Canvas) 1. Zadeklaruj dwie zmienne typu Image o nazwach rysunek1, rysunek2 w publicznej części klasy MidletKlasyCanvas. 2. Na końcu konstruktora klasy MidletKlasyCanvas dopisz instrukcje określające adres do plików graficznych piesek.jpg oraz ptaszek.jpg try { rysunek1 = Image.createImage("/piesek.jpg"); rysunek2 = Image.createImage("/ptaszek.jpg"); catch (Exception e) { System.out.println("Brak obrazka:"+e); Przekopiuj z dysku sieciowego wskazanego przez prowadzącego pliki graficzne piesek.jpg oraz ptaszek.jpg do katalogu Z:\JME-Drugi\src naszego projektu 3. Aby zobrazować pliki graficzne na płótnie należy użyć metody drawimage(), która działa podobnie jak metoda drawstring, a wiec dopisz w metodzie paint() poniższe instrukcje (umieść je za instrukcją malującą tło płótna): g.drawimage(rysunek1, 0, 0, Graphics.TOP Graphics.LEFT); g.drawimage(rysunek2, szerokośćekranu-5, wysokośćekranu - 25, Graphics.BOTTOM Graphics.RIGHT); 4. Uruchom MIDlet. 5. Zmodyfikuj samodzielnie tak program, aby zamknięcie aplikacji nastąpiło po wybraniu opcji z napisem KONIEC. (Zastanów się gdzie umieścić odpowiednie instrukcje). VIII Zadanie do samodzielnego rozwiązania na zajęciach lab. 1. Utwórz nowy projekt typu Mobile Application o nazwie Trzeci na dysku Z:\ Nadaj nazwie MIDletu nazwę Koperta. 2. Zbuduj aplikację, która narysuje na ekranie telefonu komórkowego kopertę o wymiarach 120x40 umieszczoną po środku ekranu. 3. Wypełnij tło ekranu oraz koperty dowolnym kolorem. Linie koperty wyrysuj kolorem czarnym. 4. Poniżej koperty, na ¼ wysokości ekranu umieść swoje nazwisko i imię wyświetlone kolorem niebieskim wyśrodkowane w poziomie. 5. Zamknięcie aplikacji powinno nastąpić po wybraniu opcji z napisem WYJŚCIE. Uwaga: Aby uzyskać odpowiedni kolor, należy określić 3 parametry R, G, B w metodzie setcolor() Należy uruchomić program Paint i z menu Kolory wybrać: g.setcolor(r, G, B); Materiały do użytku wewnętrznego. Opracował Zbigniew JANIK. 5