【Deskripsi Masalah】
TextEdit adalah editor teks yang digambar menggunakan gamecanvas. Makalah ini menggabungkan contoh untuk memberikan metode implementasi.
【prinsip】
1 Gunakan grafik dan gamecanvas untuk menggambar kotak teks dan kursor.
2 Ketika peristiwa input terdeteksi, lompat ke antarmuka canggih -> TextBox. Input lengkap melalui metode input panggilan sistem.
3 Kembalikan nilai yang dimasukkan oleh TextBox ke objek TextEdit.
【Pola Desain】
Proses ini sedikit mirip dengan mode dekoratif.
【Daftar kode】
TextEdit.javapackage com.token.view.components; ; ) { / /System.out.println("Draw "); ); , margin+margin+margin); y+1, lebar -1, tinggi -1); +ft.stringwidth (teks)+padding, y+padding, 1, ft.getHeight (), Cursorblinkon); , int X, int y, lebar int, tinggi int, boolean cursorblinkon) {if (cursorblinkon) {ft = font.getfont (font.face_proportional, font.style_plain, font.size_medium); .setColor (0x0,0x0, 0x0); ; CanVastext ""; MAXSIZE, INT CONSTRAINGS) {Super (Title, Text, MaxSize, Constrains); "Command.cancel, 1); String) args [0]! = Null)? (String) args [0]: ""; System.out.println (Object_name); getString (); //system.out. | args_t [3]! = NULL || .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::: ]! controller.handleevent (uicontroller.eventid.event_user_regist_edit_back, args);} lain jika (editor.equals ("regist_pa sswd")) {if (args_t [2]! = "" || args_t [2]! = NULL || [4]! = "" || args_t [4]! = NULL) {args [0] = Object_name; ; || args_t [2]! = NULL || args_t [3]! = "" || args_t [3]! = NULL) {args [0] = Object_name; [2]; CommandListener {public void commandaction (perintah perintah, dispureable disp) {if (command == okCommand) {closet extbox (true); .token.view; .; Judul Privat; WD_RE_Y; Nama Pengguna Privat; UserRegist (UIController Control) {Super (false); Menu baru (ini); Teks baru (ini);} public void show (objek [] args) {// TODO METODE AUTO-ENTEORATED StubtfullScreenMode (true); [0]: ""; ) args [2]: ""; (String) Args [4]: "if (editor.equals (" Regist_name ")) {Cursorblinkon1 = true; ")) { cursorBlinkOn1 = false; cursorBlinkOn2 = true; cursorBlinkOn3 = false; currentlySelectedIndex =1; } else if(editor.equals(" regist_passwd_re")) { cursorBlinkOn1 = false; cursorBlinkOn2 = false; cursorBlinkOn3 = true; currentlySelectedIndex =2 ; } //System.out.println(object_name); grafik); 0: Cursorblinkon2 = false; cursorblinkon2 = false; It_passwd_y, cu rsorblinkon2); Ortional, font .Style_bold, font.size_large); ); untuk (int i = 0; i <info_wrap1.length; i ++) {graphics.drawstring (info_wrap1 [i], 5, (i) * ft.getHeight ()+40, grafik.top | grafik.left); } TextEdit_name_x = 5; = StringDealMethod.Format (info, lebar-10, ft); (info_wrap2 [i], 5, (i+info_wrap1.length) * ft.getHeight ()+textedit_name.height+margin+40, grafik.top | grafis.leftswd_y = (info +info_wrap2 .length) * ft.getHeight ()+textedit_name.height+margin+40; = StringDealMethod.Format (info, lebar-10, ft); DrawString (info_wrap3 [i], 5, (i+info_wrap1.length+info_wrap2.length) * ft.getHeight ()+textedit_name.height+TextEdit_Passwd.height+2 * margin+40, gra phics.top | grafik.left) ;} TextEdit_passwd_re_x = 5; , PassWD_RE, TextEdit_Passwd_re_x, TextEdit_Passwd_re_y, Cursorblinkon3); = System.currentTimeMillis (); //system.out.println("1 "); ")) {cursorblinkon1 =! Cursorblinkon1; cursorblinkon2 = false; cursorblinkon3 = false;} lain jika (editor.equals (" regist_passwd ")) {cursorblinkon1 = false; cursorblin kon2 =! Cursorblinkon2; .Sequals (Regist_passwd_re ") {Cursorblinkon1 = false; (true) {checkTimestamp (); ; ! = "&& passwd! =" "&& passwd_re! =" ") {if (passwd.equals (passwd_re)) {userrecord.db_deleteallrecord (); UserDataitem (1, (nama pengguna +"," +passwd) .getbytes ()); ac tiveScreen", null, update}; controller .handleEvent(UIController.EventID.EVENT_NEXT_ACTIVE_TOKEN_SCREEN,args); } } break; } case KeyID.KEY_EDIT: case KEY_NUM0: case KEY_NUM1: c ase KEY_NUM2: case KEY_NUM3: case KEY_NUM4: case KEY_NUM5 : case key_num6: case key_num7: case key_num8: case key_num9: {//system.out.println(editor); .Event_user_regist_edit, args); {redraw ();
【menganalisa】
1 Gambar kotak teks (TextEdit.java)
Anda perlu melewati objek Gamecanvas dan Grafik untuk mengimplementasikan gambar, yang menggunakan strategi dan siapa yang melewati parameter ini. Selain itu, koordinat sudut kiri atas (x, y) dari kotak teks di bawah tempat tidur dan variabel kursorblinkon yang mengontrol kursor berkedip.
Public DrawTextBox (Canvas Gamecanvas, Grafik Grafik, Teks String, Int X, Int Y, Boolean Cursorblinkon) {//system.out.println("Draw "); GetFont (font.face_proportional, font.style_plain, font.size_medium); Padding; Width, Tinggi); , X+Padding, Y+Padding, Graphics.top | Graphics.Left); .flushgraphics (x, y, lebar, tinggi);
2 Gambar kursor (TextEdit.java)
public void drawcursor (grafik grafis, int x, int y, lebar int, int tinggi, boolean cursorblinkon) {if (cursorblinkon) {ft = font.getFont (font.fac e_proportional, font.style_plain, font.size_medium); setFont (ft);
3 Menerapkan Flashing kursor
Implementasi flash kursor membutuhkan threading.
UIController.javacase EvenId.event_Next_User_Regist_screen: case eventId.event_user_regist_edit_back: {Reg.show (args); () {Long saat ini = System.currentTimeMillis (); .sEquals (Regist_name ") {Cursorblinkon1 =! } ife (editor.equals ("regist_passwd_re")) {cursorblinkon1 = false; Jalankan "); while (true) {checkTimestamp (); redraw (); coba {disinkronkan (ini) {//system.out.println("3"); tunggu (50l);}} catch (pengecualian e) { e.
4 Panggil antarmuka canggih Subkelas Popuptextbox
Saat menelepon, nama objek panggilan, edit nama objek, dan edit parameter kotak diteruskan ke objek popuptextbox (harus memilikinya, tujuannya adalah untuk menyimpan nilai kotak edit. Jika tidak, ketika beberapa panggilan kembali, nilai dari kotak edit yang berbeda akan disegarkan untuk kosong.
UserRegist.java (keypressed) case keyid.key_edit: case key_num0: case key_num1: case key_num2: case key_num3: case key_num4: case key_ num5: case key_num6: case key_num7: case key_num8: case key_num9: {//skyst. (editor); args);
5 Penerimaan Parameter PopuptextBox
public void init (objek [] args) {object_name = ((string) args [0]! = null)? (String) args [0]: ""; ?
6 PopuptextBox Mengembalikan input nilai dari metode input
if (update) canvastext = this.getString ();
7 Pemrosesan Nilai Input PopuptextBox
Proses nilai input sesuai dengan objek yang dipanggil dan objek edit, dan berikan ke kotak edit objek induk.
if (object_name.equals ("regisScreen")) {if (editor.equals ("regist_name")) {if (args_t [3]! = "" || args_t [3]! = null || args_t [4]! = "|| args_t [4]! = null) {args [0] = Object_name; = args_t [4];} controller.handleevent (uicontroller.eventid.event_user_regist_edit_back, args); ]! = NULL || args_t [4]! = "" || args_t [4]! = null) {args [0] = Object_name; [3] = This.CanVastext; 2]! = "" || args_t [2]! = Null || args_t [3]! = "" || args_t [3]! = Null) {args [0] = objek_name; args [2] = args_t [2];
8 Tampilan Nilai Input
(1) Buat objek baru
Private TextEdit TextEdit_Name;
(2) Terima parameter input
Object_name = ((string) args [0]! = null)? (String) args [0]: ""; "; username = ((string) args [2]! = null)? (string) args [2]:" "; passwd = ((string) args [3]! = null)? (String) args [3] : "";
(3) Kontrol Kursor, Posisi ke Objek Pengeditan, dan Mengontrol Kursor Menghadirkan Objek Pengeditan (Metode Jalankan)
void redraw () {switch (saat ini diselenggarakan {case 0: {cursorblinkon2 = false cursorblinkon3 = false; Break;
(4) menggambar kotak edit
Private void redraw () {... TextEdit_name.drawtextBox (ini, grafik, nama pengguna, TextEdit_name_x, TextEdit_name_y, Cursorblinkon1); D.DrawTextBox (ini, Grafik, PassWD_RE, TextEdit_Passwd_re_x, TextEdit_Passwd_re_y, Cursorblinkon3);
Efek yang dicapai ditunjukkan pada Gambar 1: