|
|||||||||||||||||
![]() |
|||||||||||||||||
Pràctica |
![]() |
Exercicis
|
|||||||||||||||
En aquesta pràctica introduirem dos controls més: els checkboxes i els Radio Buttons, que a l'AWT es diuen checkboxgroups (de fet són checkboxes agrupats i lleugerament modificats). De passada, aprofitarem per començar a conèixer la classe java.awt.Font i a aprendre a fer-ne servir alguns dels seus mètodes. |
|||||||||
Checkboxes: | |||||||||
![]() |
Són aquestes finestretes quadrades que podem marcar o desmarcar. Es fan a partir de la classe java.awt.Checkbox:
|
||||||||
Juguem amb checkboxes: | |||||||||
![]() |
Es tracta de fer un frame que contingui un label amb un text fix i quatre checkboxes a la dreta que serveixin per a canviar l'apariència del label: | ||||||||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
![]() |
|||||||||
De passada, explorarem una mica la classe java.awt.Font, que és la que serveix per gestionar totes les qüestions relacionades als caràcters dels textos. | |||||||||
Així creem el projecte Check01 amb aquest codi al fitxer Check01.java: | |||||||||
/* * @(#)Check01.java 1.0 02/09/22 * * You can modify the template of this file in the * directory ..\JCreator\Templates\Template_1\Project_Name.java * * You can also create your own project template by making a new * folder in the directory ..\JCreator\Template\. Use the other * templates as examples. * */ //package myprojects.check01; import java.awt.*; class Check01 extends Frame { |
|||||||||
ElMeuPanel
panel=new ElMeuPanel(); add(panel,BorderLayout.CENTER); |
|||||||||
addWindowListener(new
WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); } public static void main(String args[]) { |
|||||||||
mainFrame.setSize(400,
100); mainFrame.setTitle("Checkboxes"); |
|||||||||
mainFrame.setVisible(true); } } |
|||||||||
class
ElMeuPanel extends Panel implements ItemListener { Label label; public ElMeuPanel() { //constructor super(); setLayout(new BorderLayout()); label=new Label("Juguem amb Checkboxes...",Label.CENTER); add(label,BorderLayout.CENTER); Panel panel=new Panel(); panel.setLayout(new GridLayout(4,1)); Checkbox chbox_1=new Checkbox("Color"); chbox_1.addItemListener(this); panel.add(chbox_1); Checkbox chbox_2=new Checkbox("Negreta"); chbox_2.addItemListener(this); panel.add(chbox_2); Checkbox chbox_3=new Checkbox("Inclinada"); chbox_3.addItemListener(this); panel.add(chbox_3); Checkbox chbox_4=new Checkbox("Gran"); chbox_4.addItemListener(this); panel.add(chbox_4); add(panel,BorderLayout.EAST); } public void itemStateChanged(ItemEvent e) { Object checkObj=e.getSource(); if (checkObj instanceof Checkbox) { Checkbox chbox=(Checkbox)checkObj; String lblCb=chbox.getLabel(); boolean state=chbox.getState(); if (lblCb=="Color") { if (state) { label.setBackground(Color.pink); } else { label.setBackground(Color.white); } } else if (lblCb=="Negreta") { Font font=label.getFont(); int style=font.getStyle(); if (state) { style=style+Font.BOLD; } else { style=style-Font.BOLD; } font=font.deriveFont(style); label.setFont(font); } else if (lblCb=="Inclinada") { Font font=label.getFont(); int style=font.getStyle(); if (state) { style=style+Font.ITALIC; } else { style=style-Font.ITALIC; } font=font.deriveFont(style); label.setFont(font); } else if (lblCb=="Gran") { Font font=label.getFont(); float size=font.getSize2D(); if (state) { size=2.0f*size; } else { size=0.5f*size; } font=font.deriveFont(size); label.setFont(font); } } } } |
|||||||||
Observem: | |||||||||
![]() |
|
||||||||
|
|||||||||
La classe java.awt.Font (I): | |||||||||
![]() |
La classe java.awt.Font representa fonts, els quals tenen com a missió el fer visibles els textos. Una primera qüestíó important és que cal considerar dos tipus de fonts:
Ja es veu que si hem de mantenir el lema "Write once, run anywhere" és recomanable l'ús de fonts lògics i no el de fonts físics. Simplificant-ho tot molt i molt, un font té un nom, un estil i una mida (name, style, size). Per tenir un font, el mètode constructor és public Font(String name, int style, int size).
Els mètodes de la classe java.awt.Component (classe mare de totes les menes de components que podem posar en un container) public Font getFont() i public void setFont(Font f) ens permeten, respectivament, obtenir el font actiu del component, o bé fer que un determinat font sigui el font actiu en el component. Igualment, els mètodes, ara altra vegada de la classe java.awt.Font, public String getName(), public int getStyle() i public int getSize() ens proporcionen, respectivament, el nom lògic, l'estil i la mida del font arrodonida a un enter. Per a més precisió, el mètode public float getSize2D() ens en proporciona la mida, però ara com a float. Si volem modificar l'estil o la mida d'un font, podem fer servir algun dels mètodes de la classe java.awt.Font public Font deriveFont(float size), public Font deriveFont(int style) o public Font deriveFont(int style,float size). El nou objecte font obtingut es fa el font actiu amb el mètode de la classe java.awt.Component public void setFont(Font f). Si cal obtenir informació precisa sobre l'espai en pixels que ocupen caràcters i cadenes hem de recòrrer als mètodes de la classe java.awt.FontMetrics, dels quals tractarem més endavant quan parlem del dibuix a Java. |
||||||||
|
|||||||||
![]() |
Ara ja estem en condicions d'entendre el codi escrit per a cadascuna de les tres últimes alternatives de l'exemple anterior:
|
||||||||
Radio buttons o grups de checkboxes: | |||||||||
![]() |
Un checkbox com els d'abans ens permet contestar "Sí" o "No" a una pregunta que ens fa l'aplicació. Si la pregunta té més de dues alternatives excloents, llavors cal fer servir checkboxes convenientment agrupats, cosa que gestiona la classe java.awt.CheckboxGroup. La classe java.awt.CheckboxGroup no és més que una superestructura abstracta que té dues finalitats:
|
||||||||
El mecanisme de creació i de gestió d'un grup de checkboxes és molt similar al de creació i gestió de checkboxes aïllats. Vegem-ho amb aquest altre exemple: es tracta de fer un frame com aquest: | |||||||||
![]() |
![]() |
||||||||
![]() |
|||||||||
en el qual el grup de checkboxes de la dreta serveix per canviar el font del label de la dreta. | |||||||||
Aquest n'és el codi: (projecte Check02) | |||||||||
/* * @(#)Check02.java 1.0 02/09/27 * * You can modify the template of this file in the * directory ..\JCreator\Templates\Template_1\Project_Name.java * * You can also create your own project template by making a new * folder in the directory ..\JCreator\Template\. Use the other * templates as examples. * */ //package myprojects.check02; import java.awt.*; class Check02 extends Frame { public static void main(String args[]) { |
|||||||||
mainFrame.setSize(400,
120); mainFrame.setTitle("Grup de checkboxes"); |
|||||||||
mainFrame.setVisible(true); } } class ElMeuPanel extends Panel implements ItemListener { |
|||||||||
label=new
Label("Grup de checkboxes...",Label.CENTER); Font font=new Font("SansSerif",Font.PLAIN,22); label.setFont(font); |
|||||||||
add(label,BorderLayout.CENTER); Panel panel=new Panel(); panel.setLayout(new GridLayout(5,1)); |
|||||||||
chbxgr=new
CheckboxGroup(); Checkbox chbox_1=new Checkbox("Serif",chbxgr,false); |
|||||||||
chbox_1.addItemListener(this); panel.add(chbox_1); |
|||||||||
Checkbox chbox_2=new Checkbox("SansSerif",chbxgr,true); | |||||||||
chbox_2.addItemListener(this); |
|||||||||
Checkbox chbox_3=new Checkbox("Monospaced",chbxgr,false); | |||||||||
chbox_3.addItemListener(this); panel.add(chbox_3); |
|||||||||
Checkbox chbox_4=new Checkbox("Dialog",chbxgr,false); | |||||||||
chbox_4.addItemListener(this); panel.add(chbox_4); |
|||||||||
Checkbox
chbox_5=new Checkbox("DialogInput",chbxgr,false); chbox_5.addItemListener(this); panel.add(chbox_5); |
|||||||||
add(panel,BorderLayout.EAST); } public void itemStateChanged(ItemEvent e) { Object checkObj=e.getSource(); if (checkObj instanceof Checkbox) { |
|||||||||
Checkbox
chbox=chbxgr.getSelectedCheckbox(); //Checkbox chbox=(Checkbox)checkObj;//Alternativament String lblCb=chbox.getLabel(); Font font=label.getFont(); int style=font.getStyle(); int size=font.getSize(); font=new Font(lblCb,style,size); label.setFont(font); |
|||||||||
} } } |
|||||||||
Només hem marcat amb groc les parts que són diferents del codi de l'exemple primer. Observem:
|
|||||||||
![]() |
Observeu que, molt possiblement, els fonts "SansSerif" i "Dialog" tenen el mateix aspecte, mentre que, per la seva banda, "Monospaced" i "DialogInput" també. Això és una mostra de com la vostra Màquina Virtual de Java gestiona els fonts lògics, i varia de sistema a sistema. | ||||||||
![]() |
|||||||||