Mục lục
A. Các mức đồ họa trong J2ME
I. Tổng quan về J2ME
!"#$$%
&'() * +
II.Các thành phần đồ họa ở mức cao của ứng dụng MIDP ,
III. Các thành phần đồ họa ở mức thấp của ứng dụng MIDP
&-
$-.
B.Ứng dụng Game trong J2ME .
I. Sơ lược về lập trình Game trên J2ME.
&-.
/+
01
./,
23*/.
II. Xây dựng Game với Game Builder trong IDE NetBeans .
LỜI MỞ ĐẦU
45//67895/$5:;5<=> *?
@$$%A-B9CA$D;E5 D>$:$(F$:$
(<$)67-BFG$H)I5>$)$:$*?@$6>9$FJKC
/9$F'9$F6ICL9$F6"#$FM/>N$OP
Q>B-R5>$<F;6789<=>
@$"F$#K$9 5ST895"<=9S
;*5 5U5*$%DU$ND6O$V(WIXY$%
1
B*5 )676:ZF5$G(W<=
[*CL$"$>$:$"(P>N\"(PKM:M
$>$$-B$%]CAF^$(*5[*9$-F-
&#J$)H[/:>3X_`- )(O&O
[ F&OOFCATN9$U:$!>_54K
CY$#>M:9$5$<
&#J$)H$:$5*&O[ K$DaD
bJR/@5#c$#>55 5U5*
A .Các mức đồ họa trong J2ME
I. Tổng quan về J2ME
1. Giới thiệu J2ME :
CL$:;d6"#$&F(5e->*$%
()T"-@A$%0M/"P/"e->*
5CH$9*5$>>F/"f*5T#
9F*5 )$>$:$"(P$DI$XgF9_N[
*$:$>N" I$L:/)>>-)
h$%F$I/$>5//Y*5Oai("
X;*<=D$5D
2 Kiến trúc của J2ME :
2
Giới thiệu các thành phần trong nền tảng J2ME:
jTP? &>k>l&Xmn5^$)P?OCA
[ $>G$:$"(PCL$R*>N(WL$:$^$IFI=
Cn
o!;5-B*CL(
o!;5B$(Jp*b
o!;N6"B
q>R/*5^$)$:$5-)JX"(PC0-F4>6(f($
)@$[/%$:$^$)>0MP;$:$*$D;@5>
OCA*XM:5OM-@XM:5/F$:$<=CL$
N>$D;I$*"(P$>X$D;QI=C*
"$CH$>>N0-$D;-pi$CH
$%$:$B;X;$D;$N/94>6
_/0KCN&>k>n
3
o&q&l&>$q$&>k>r&X"(P6"B
NmnCL$"6";f5>PCA$:$"(P$XXl*>srmF$:$
"(P5/OCA*5:/95eqt6>)2!U
(Q5/(N$"&q&CL$f6OR/
lu* mFNC$>vCA-p=5) $:$<=
FI=C*5*
o&q&r&>$q$&>k>l&X"(P6"Bmn&q&CL$
Cf"$:$"(P$DI'NHG"(P$&q&
CY/"H$:$B:/;(5-p=04a"(P5/$D
(HlOCA*5(m5$D(Jp*bNH&:$-)
h5/$D;6;"C$:$:/eqt$X$>F>Ns(F
&)N&X6; $<:/)>lQ*$m5
L$:$*l$* m$H();$$XOCA$>$:$<=
3/F(N$#bwB$:$"(P$XXF>N$" 5
/C(5(Jp*b6O;/$[:/)>iLX$)$:$I
'C:/)>$%0
jTP? e>k*n
e>k*W&>k>(w$:$5>$:$$* ;(iL$:$I
'$>d"(P$/(&)&>k> $Da>k**
M5da>k*5/$D;`$:$$* *YT"R/$D;
X/>]>k*P?L$:$$* 6:$FCA
6O;$/;<="$>>k*5/5$N/
:/]L>k*6:$&x*b>DF(N6O;*X/<=
"0/5$N/$:$:/]L0R/*5$:$>k*
(;n
o>(*yk>>q$e>k*lyqemn>k*5/-z(i-$:$I'
C]L6"BF$:$5[]L>CA`5>&q&
e>k*5/CL$"6"$%/";f5>9^$I*5
4
5;PN$"F*CL$<$DNq>Dyqe-z$$X
>CA`H)5$:$I'NH)@_33e&D
;Dyqe*5>k*i"X(WD*56"<$$H()$>*
$:$:/lu* m
oeqte>k*nCH@yqeFCPCA*5$:$:/eqt5
5(*H
o{>>e>k*n$>vW$:$I'$%&q&[*$:$
C$%(&>
4>5$G$De->*U--e>k*Fe->*e>k*F|ye>k*F
e>k*
3 Căn bản về lập trình J2ME :
3.1 MIDlet :
yq**5<=CL$"6";$N/$:$"(P
yq*$<$:$*`(W&q&5yqe(yq*8
>^$ yq*CL$DD$`5v>k*t|{*t|-}
-5$>$$5^5>>NQX $%**5N>$:$yq*
0R/*5$X#$*$%yq*
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*
public class MidletExample extends MIDlet {
public void MIDletExample() { }
public void startApp() { }
public void pauseApp() {}
public void destroyApp(boolean unconditional) { }
}
**O*O6"d*yq*$D-}>yqeyq*w
>Dn~J$>>*F$:$CH<$$H()5**O
)$Dn
startApp( ) neCH<$5/CL$9(W(M)*b<=66WN>
yq*5]6yq*W dN:-
5
pauseApp( ): eCH<$5/9(M)*b<=]6<=$[N
d<=@$!-p=-t)D[5
/$%yq*;5($>$:$<=6:$
destroyApp( ): eCH<$5/CL$`6>:6gyq*3C$D)
)D>5>5(CL$*X/(Wyq*
jQGA$%*n
3.2 API của J2ME :
<=yq*$V$DBCL;q-*/TBCL5/`
;*X/O BCL(5/FI=5CL$]LF5(>8$:$
CH<$;/$[$:$BCLCL$(5/TBCLq-*/$["
$>(M)*b$(5/"(P 6;5[5>-zCL$;
P*"(P
^$`$V$DBCLq-*/<]yq*FC B
CL>yq*$D;CL$;P"(PC{>-F
3JU>J-F&>$>-F
6
BCLq-*/(**55[CL$;P"(P
yqe$<*$>$%*q-*/(**50$5&-_CR/O
)BM
BCL0$6O)*5$:D"(PF5*
0$5/-zCL$d6"(W$:$5[;PW<$$>F$I$:$5
[5/-zCL$;P5_CR/-zO)BM
$%*0$5$:$5[;W<$$>
&-CL$-p=>$:$$CH/$:$<=$[
zaBCL(F^$;$%D*5II6)$/;F>:$
7
*5/;z$:$BCL*5&-$x$D;(f$:$-@
6(wXI(XQ*5<$X$>vCA*g:>
:$5&)* w>D~J$>>*$j
3>*$:$5[>W<$$>CL$-p
=;N>$:$F$:$*@$9$5^$>
II.Các thành phần đồ họa ở mức cao của ứng dụng MIDP
1. Form và Items :
3>[5/-z$:$5[CL$;P{>
{>$VH)*56$<$:$5[F5]5[CL$
d6"d*y&#-zJM$:$5[;P"(Pn
oq{*
o
o0y
o3J{*
o&>$>
o0$
o&->y
oyyy
a) DateField
35[q{*$$XCH@$M;>:$BCL
qCL$P?>~*q!N>BCLq{*F(N
$[$V•*5CA`$V$D;$V-p5/F$V-pA/8A$)
&:$CH<$6WN>$%*q{*8n
DateField(String label, int mode)
DateField(String label, int mode, TimeZone timeZone)
&:$>CH<$%*q{*8n
DateField.DATE_TIMEn$>v/i5/A
DateField.TIMEn$V$>v/iA
DateField.DATEn$V$>v/i5/
QI=n
private DateField dfAlarm;
// Tạo một đổi tượng DateField với nhãn, cho phép thay đổi cả ngày và giờ
8
dfAlarm = new DateField("Set Alarm Time", DateField.DATE_TIME);
dfAlarm.setDate(new Date());
b) Gauge
5[*56;>CACL$`;O)<$
>55$O$&D*>N*5*>NCH:$5*>N6OCH
:$>N[$>vCA`$D;/iF*>NGgCA
:;)$
qCAR/*556WN>$%*n
Gauge(String label, boolean interactive, int maxValue, int initialValue)
QI=n
private Gauge gaVolume; // Điều chỉnh âm lượng
gaVolume = new Gauge("Sound Level", true, 100, 4);
c) StringItem
5[0yCL$`;;PK/$]'()
4CA`6O;/iK/$]'()6$CH
$N/
0y6O-@6
eCH<$6WN>$%*0y
StringItem(String label, String text)
d) TextField
5[3J{*CH@C(X6€$:$BCL'()
(;5>UN$D;$VPKF-B6b@BCL$vF5
*>Na*CL$v4>53J{*$G$>v(N5>
6h$:$6b@5>-zCL$$(W$:$6b@^N
eCH<$6WN>$%*3J{*
TextField(String label, String text, int maxSize, int constraints)
35[<constraints *55[5$#MRFD*5
CH;J:$P*>Na*5>CL$v5>3J{*
yqeP?$:$-B5($-$>5[3J{*n
ot4•n$>v(X6€6b@5>
otytqq|n$V$>vR5>$:$P$V*L*
o4‚|y&n$V$>v-B
oe_ƒ44‚U|n&V$>v-B>N
o‚|n&V$>v$:$6b@L*(>‚|
oet00uƒ|qn$X$)$:$6b@5>
9
e) ChoiceGroup
35[&>$>$>vCA`$9d-:$[5>
KCL$P?C$&>$>$D*>Nn
o*r-*$>l$>v$9 =$mnD5/$D*M"$:$
$$6(>J
oJ$*-r-*$>l$VCL$$9=$mnD5/*M"D$:$
>(>
f) Image and ImageItem
_*CL$`;;P)*5ny5yyy
CL$`;N>BCL)5aOC*5$ $>5
$ F5`)$D("i/6OyyO)X)-z
CL$;PC"5>FI=X)-zCL$^WRF/^ I
(:F/($%5yqeC*>N)*5*>N)6O
("i5)("iX)6O("i6O;(P/i6;
d*#$DCL$N>T^$C$%*>N)5/*5CL$9$d
X)("i $H()*5`T 5/`/$5>$(NN>
$%X)(w$:$D*`&#-z*5$
aX)6O("i>()-
&:$CH<$@$>*y5yy
oImage createImage(String name)
• Image createImage(Image source)
• Image createImage(byte[] imageDate, int imageOffset, int imageLength)
• Image createImage(int width, int height)
• Image createImage(Image image, int x, int y, int width, int height, int transform)
• Image createImage(InputStream stream)
• Image createRGBImage(int[] rgb, int width, int height,
boolean processAlpha)
• ImageItem(String label, Image img, int layout, String altText)
T>NKCR/O)*5"5>N>X)dF5fD
BCLyy5(<$)5>{>
Form fmMain = new Form("Images");
10
// Create an image
Image img = Image.createImage("/house.png");
// Append to a form
fmMain.append(new ImageItem(null, img, ImageItem.LAYOUT_CENTER, null));
&#bne4*5*>N)/XCL$]L(W(X6€"(Pyqe5>
2. List, Textbox, Alert, và Ticker :
a) List
-$<K/$:$*@$9CL$;>(N&#
KX/*>N$>v *@$95*>N$VCL$v$96*5$
&>$>qN<*5*5N6OCA&:$-6OCA
L$`;;@$H$:$$9*@
b) TextBox
3JU>JCL$`;$>v G35[3JU>J5
3J{*$Da5($B>$$VP*>NCL$
vR5>QI=t4•FtyF‚|yqCR/*5CH<$@$%
3JU>Jn
TextBox(String title, String text, int maxSize, int constraints)
c) Alert và AlertType
t*H)*5>NXg&D*>Nt*n
o>*n*5*>N>NO(:>CL$(5/$>"6CA`X
#8b
o4>r>*n*5*>N>NO(:>$VCL$(5/>-BR/
XP
&:$CH<$6WN>$%t*n
Alert(String title)
Alert(String title, String alertText, Image alertImage, AlertType alertType)
35[t*3/-p=R;O(:>$>CA`("$D
-@6J)/QI=(N$D;-p=t*3/;W>NR5>
D(:>$>CA`("6$D*]J)/
35[t*3/(>82*>NRP-}*5nO(:>FJ:$F
(:>*]FO(:>5$)(:>
11
3X/$:$CH<$@$%t*$>("*5t*$D;(>8
$""BCLt*3/
d) Ticker
35[3$6L$`;;>N$]$N/>$
3-B/X$%5[3$6*5>N'()CL$(5/
3B$5$ $BCL$J:$P(W$$5^"(P5>
eCH<$6WN>$%3$6
Ticker(String str)
3d$R/R$X$:$5[;"(PFX/*55[3$6
6O*5*$>$%*0$53$6*5("$%*0$T 5/
$D?*53$6$D;CL$f5>(X$<*$>$%*0$(>8
$)t*
3. Xử lý sự kiện :
a. Đối tượng Command :
!BCLJ)/"(PFBCL&>a
O -@6D3O5/(>8*>N5@$FK$%
*5C$%$ID3>F$:$5D$
CL$;CN$:$#"(P
4"$DM: 5CL$;P"(PF"(P-zN>
@$H;$<$:$5
&V$D$:$5[yqe-R/$D;$<$:$BCL&>
*5n{>F3JU>JF-5&-
&:$(C$$H();Jp*b$:$-@6BCL&>n
o3N>BCL&>
oT^BCL&>*BCL{>F3JU>JF-F
/&-
o3N>(*f
!$D-@6J)/F(*f-z:-*A9"CH
<$$>t$>lm3>RCH<$5/(N$D;J:$PB
CL5>:--@65N>$:$Jp*bCH<
qCR/*5>NK9$N>-@6&>5Jp*b-@6n
private Form fmMain; // Form
12
private Command cmExit; // Command to exit the MIDlet
fmMain = new Form("Core J2ME"); // Create Form and give it a title
// Create Command object, with label, type and priority
cmExit = new Command("Exit", Command.EXIT, 1);
fmMain.addCommand(cmExit); // Add Command to Form
fmMain.setCommandListener(this); // Listen for Form events
public void commandAction(Command c, Displayable s)
{
if (c == cmExit)
{
destroyApp(true);
notifyDestroyed();
}
}
b. Đối tượng Item
4>5$Jp*b-@6(wBCL&>$D;Jp*b-@6(w
BCLy4 BCL>yqeKCL$P?C$$>$Jp
*b$:$-@6$=;5>DQI=BCLq{*$>vCA-p=
$9*@5/5A5FBCL3J{*$>vCA`
5>$]$:$6b@F-B5$:$6b@^$(
3CH@C$Jp*b-@6(wBCL&>F6$D/
iJ)/B(X6€5[y5>CH<$
itemStateChanged()-zCL$9Q5$#-z@$$:$Jp*b(>
CH<$5/
qCR/*5>NK9$N>-@6&>5Jp*b-@6n
private Form fmMain; // Form
private DateField dfToday; // DateField item
fmMain = new Form("Core J2ME"); // Create Form object
dfToday = new DateField("Today:", DateField.DATE); // Create DateField
fmMain.append(dfToday); // Add DateField to Form
13
fmMain.setItemStateListener(this); // Listen for Form events
public void itemStateChanged(Item item)
{
// If the datefield initiated this event
if (item == dfToday)
}
c. Ví dụ
qCR/*5>NK9$N>5Jp*b$:$-@6&>Fy
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class EventProcessing extends MIDlet implements
ItemStateListener, CommandListener
{
private Display display; // Reference to Display object for this MIDlet
private Form fmMain; // Main Form
private Command cmExit; // Command to exit the MIDlet
private TextField tfText; // TextField component (item)
public EventProcessing()
{
display = Display.getDisplay(this);
// Create the date and populate with current date
tfText = new TextField("First Name:", "", 10, TextField.ANY);
cmExit = new Command("Exit", Command.EXIT, 1);
// Create the Form, add Command and DateField
// listen for events from Command and DateField
fmMain = new Form("Event Processing Example");
fmMain.addCommand(cmExit);
fmMain.append(tfText);
fmMain.setCommandListener(this); // Capture Command events (cmExit)
fmMain.setItemStateListener(this); // Capture Item events (dfDate)
}
// Called by application manager to start the MIDlet.
14
public void startApp()
{
display.setCurrent(fmMain);
}
public void pauseApp()
{ }
public void destroyApp(boolean unconditional)
{ }
public void commandAction(Command c, Displayable s)
{
System.out.println("Inside commandAction()");
if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
public void itemStateChanged(Item item)
{
System.out.println("Inside itemStateChanged()");
}
}
-B)9
15
III. Các thành phần đồ họa ở mức thấp của ứng dụng MIDP
16
!*$>:/IFCA$#$V-p=$:$5[>
$D-};N>>CA`3/F6*$>>N
-p=yqeF5[>$D-}6:„>5yqe$V
$$X$:$5[>O=XTB:/IF"
5[>$#$[6O-}$D>($O$=:;l0q!mF
$#$D;E5-p=C$%5$$X<(T 5/
X6D$>$:$<=T3qT*O/$[*CLg&#
6O;I$L$)C5><=;-p=>^$5
5[>T;)M/"X 5/F$#$[)-p=C
*>CA`$XXl>sr*‚-yk$(-m;
N>$:$5[>>B
Canvas 5Graphics *5*:$%$:$5tey$XXUN-z*5X
$)$:$$O$(w/&-*56z$>vCA:;$D
6)'z*"(P(5/$xC*5$Jp*b-@6&G*$-
$$X$:$$O$=-@;zCdrawRoundRect() 5drawString()
1. Lớp Canvas
&-*5*$H-W>CL-p=;Jp*b$:$-@6$XX5
$:$X *M"89;;P*5
q>&-*5*)>l(-$mF()R*&--z6O;N>
BCL@$"5)OM$:$*$>$%D&:$*$>$%&-F
-6J-&-F)$5^CH<$)>$%DF>&-$V$D
CH<$lm*5CH<$)>F$D;$5^$>$%*&-
C-n
public class MainCanvas extends Canvas{
public void paint(Graphics g){
g.setColor(255,255,255);
17
g.drawString(“SMI Java”,0,0,Graphics.TOP|Graphics.LEFT);
}
}
1. Hệ tọa độ:
=$[$%$#*5*5MB=$9;*5$
"(P;_B9$>*&-$DR9*5;:
$%"(P(5/:PJ'[ I)F:P/'[6
JBIC!z5/(#z*5;)
&:$CH<$-R/-z#J:$P$ 5$ $>$%$-n
…ulmnJ:$P$ $%$-
…_lmnJ:$P$ $>$%$-
& 5$ $>$%&-$xN$>>5(I$6z
$D;"(P(5/4D$:$6:$F$#6O;$VP6I$C$
$>$-F5[ "(Pyqe-z) I$*X$D
;$DB"(P$>C$
2. Vẽ trên đối tượng Canvas:
3"*$"z&-*>5(5n
&D$";&-CL$;Pn
18
r4>*n>$"5/F$ $>`;P$-(wi$ $>
5d` 5`z$:$$>
r{**n>$"5/F$ $>`;P$-(wi$ $>5
&:$BCL&-CACL$N>>$"^$PT;"*$"
k**5F(N$V$[9CH<$-{**0$>l(>>*>m
Q$9CH<$-{**0$>l(>>*>m@$$X*59CH
<$-†&lsFmF(CACH<$5/6O*5
‡=$D;*L=CH<$5/;/i$ $>5>$
`zB$:$"(P$D$<$/J>/5
(eCH<$l$-m
reCH<$l$-mCL$-p=;z$:$BCL$-*
5T;9CH<$l$-mFHK(N$V$[N>
-$$%*&-5-D9CH<$l$-m
r&D;9CH<$l$-m$:$(X8(OM9
CH<$lm
rQ$9CH<$lmOM9CH<$lm$D;6O
CL$@$/*<$4D$D;(P>K$>"6*8lk*>sm
6;) dCH<$Jp*b-@6N0@$EWR/6O)*5
X *FC>6Jp*b$:$$/;F$:$>5X;6I$>N
$z*N*59CH<$q-*/$**0**/lm//$[z*Nd
(>^$33-64>5F<=$D;v($$z*N
/*<$(w$:$9CH<$-$|-lm‡=$D;-p
=CH<$CH<$q-*/$**0**/lm/-$|-lm;
8(CH<$lm
QnJD5
19
protected void paint(Graphics g)
{
// Set background color to white
g.setColor(255, 255, 255);
// Fill the entire canvas
g.fillRect(0, 0, getWidth(), getHeight());
}
2.Lớp Graphics:
rTBCL$-CL$-p=(W&-FD$D;CL$(;E@$"
*5/OM(>kkr-$C$6z*5
rTBCL$-]Lz$:$$]-FFCAˆFCAG
r&$X6;5-f$.(F>D1($>]5[5F
5(*!O)X$)$:$"(P ]L[/%.(5F/
$#-zCL$:JN$:$5-f$/$[$%<=5>()5N
CL$]L"(P
r$-$DCH<$XM9-*lJF/m;P$$/;
9B$FCH<$5/CA`>$:$67$5
r4>5CH<$-*lJF/mF*$-$G$DCH<$
aM96:$*5-&*lJF/FsFmF$:$`w
>5`$*CL$"*-z6O$D*@$F$I 5/*5'B$
M:z
1. Thiết lập màu:
5-f$>BCL$-CL$N>d5$H()*5gFJ*=$5
JCHl|UmCL$(;E(W.(5F]5$"1(4""
(P6O]L;P5/$V]L-B5IH"(P-z@
$/;i;;P5[X->/$[/-$*`;;P
$:$-f$56:$5f
!:5$>BCL$-F$D;`>$:$n
o!"L5lgFJCH5J*=$m>-B/6;/
(;Ed5[>d-B!6"L5F]5
20
CL$(;E(W1(5J"><@d$>JBX*5gFJ*=$5
JCH
| | | | | | | | U U U U U U U U
|q |4 U‚
q>DF;6"L:P55/5>-B/6;F)P$(
;$D6"M)$IJ:$:P5g-zP$:+(-F:P5J*=$
P$:1(-5:P5JCH$"1(XX
Qqn
int red=0; 0 0 0 0 0 0 0 0
int reen=127; 0 1 1 1 1 1 1 1
int blue=255; 1 1 1 1 1 1 1 1
int color=(red<<16) | (green<<8) | blue;
g.setColor(color); //g là đối tượng kiểu Graphics
//Gán giá trị cho từng màu cơ bản riêng biệt:
int red=0;
int green=127;
int blue=255;
g.setcolor(red, green, blue);
3CH@F6*X/:P5F$x$D;*X/CN6"L/d
5(4"*X/:P5CN6"LF;$DCL$:P5$>
d5$H()$[)(g$:$(6OI$L
Qn
int color, red, green, blue;
color= g.getColor(); //g là đối tượng kiểu Graphics
red=(color & 0xFF0000)>>16;
green=(color & 0xFF00)>>8;
blue=color & 0xFF;
&D;6;"(P$D556O(wCH<$n
javax.microedition.lcdui.Display.isColor().
4>5$D;*X/-B5"(P$D]L(wCH<$
javax.microedition.lcdui.Display.numColors().
21
F""(P$V$D5f:P) *5:P/-$*^$
P
2. Nét vẽ
Kiểu nét vẽ (stroke style): !zCAˆFCAGF/$aF
$D;*@$96;vz*5v* l$-0ƒyqm/$:$6>)
l$-qƒ33qm4v* *5:P^$P$%$:$6;z
Các phương thức vẽ:
rvoid drawLine (int x1, int y1, int x2, int y2)
QzCAˆd;lx1, y1m";lx2, y2m
rvoid drawArc (int x, int y, int width, int height, int startAngle, int acrAngle)
QzCA$>D$arcAngle (f[dD$startAngle "$aJ:$
P(WD$:lx,ym5$ 5$Nwidth, height
rvoid fillArc (int x, int y, int width, int height, int startAngle, int acrAngle)
QzCA$>D$arcAngle (f[dD$startAngle "$aJ:$
P(WD$:lx,ym5$ 5$Nwidth, height 5O5(>
CA$>dz
rvoid drawRect (int x, int y, int width, int height)
Qz$aD$:lx,ym5$ 5$Nwidth, height
rvoid drawRoundRect (int x, int y, int width, int height, int arcW, int arcH)
Qz$a$:$D$GarcW 5arcH *56I$C$$%$a
>N"D$$>
- void fillRect (int x, int y, int width, int height)
3O$a
rvoid fillRoundRect (int x, int y, int width, int height, int arcW, int arcH)
O$aD$G
Qqn
g.drawArc(5, 5, 75, 75, 0, 225);
g.drawArc(80, 70, 75, 100, 90, 225);
_$a8.*>Nn
22
o_$aCAF6OO
o_$aD$$>F6OO
o_$aCAFO^$
o_$aD$GFO^$
_$aD$G*5$a>D$:$D$CL$z>NCA
$>$<6O)*5D$OC$aOCA3>D$:$
D$$>*5‰CA$>"$a6I$C$5CH<*5n
$u5$_
Qqng.drawRect(1, 1, 60, 40);
g.drawRoundRect(70, 50, 60, 40, 30, 40);
g.fillRect(1, 1, 60, 40);
g.fillRoundRect(70, 50, 60, 40, 30, 40);
23
Các phương thức hỗ trợ vẽ text:
rvoid drawChar (char character, int x, int y, int anchor)
z6b@character *5
rvoid drawChars (char[] data, int offset, int length, int x, int y, int anchor)
z$]6b@data $ 5length dPIoffset *5
rvoid drawString (String str, int x, int y, int anchor)
z$]str *5
rvoid drawSubstring (String str, int offset, int len, int x, int y, int anchor)
z$]$>$D$ 5len FdPIoffset $%$]str *5
rFont getFont()nX/BCL{>N
rvoid setFont ()n:{>$>BCL$-
!zJ*5F(X6;D*56b@/$]6b@F)
$$X%(-Bnx, y 5anchor3>DFlJF/m*5>N;B$F5
$>*5PICHB$%;B$->>NJ-zCL$;P&:$PI
CHB$%$>KCL$P?-}>*$-
24
3. Font chữ:
e[-R/$xM96O6v*5$:$-p=k>$aCL$]L
(W>$XX$%<=yqe0R/*5-B$:$CH<$
@$%*{>
- Font getFont(int face, int style, int size)
- Font getFont(int fontSpecifier)
- Font getDefaultFont()
-B$I$%*{>
FACE_SYSTEM
FACE_MONOSPACE
FACE_PROPORTIONAL
STYLE_PLAIN
STYLE_BOLD
STYLE_ITALIC
STYLE_UNDERLINED
SIZE_SMALL
SIZE_MEDIUM
SIZE_LARGE
&:$-B6;:$D;CL$6"LOM>:p/QI=n
Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD |
Font.STYLE_ITALIC, Font.SIZE_MEDIUM);
06(N$D$""BCL{>F(N$D;/XD;
J:$PO$%$:$$$$%D
int getFace()
int getStyle()
int getSize()
boolean isPlain()
boolean isBold()
boolean isItalic()
boolean isUnderlined()
!I$C$$%$:$k>$aCL$J:$P(W$ $>$%k>$aF( 5
I(w;)$%$]6b@>k>J:$P-B$:$
CH<$-]L6CH:$BCHk>
int getHeight()
int getBaselinePosition()
int charWidth(char ch)
25