// Java core packages import java.awt.*; import java.awt.event.*; // Java extension packages import javax.swing.*; public class CheckBoxTest extends JFrame { private JTextField field
Trang 1Đ tài 10 L p trình giao di n đ h a GUI ề ậ ệ ồ ọ
I Gi i thi u AWT ớ ệ
Abstract Windows Toolkit – AWT: Là th vi n c a Java cung c p cho l p trình viên cácư ệ ủ ấ ậ
gi i pháp giao di n ngả ệ ười dùng đ ho (Graphical User Interface - GUI) thân thi n.ồ ạ ệ
M t giao di n ngộ ệ ười dùng được hình thành t các ph n t c a GUI M t ph n t GUIừ ầ ử ủ ộ ầ ử
được thi t l p b ng cách s d ng các th t c:ế ậ ằ ử ụ ủ ụ
1 T o đ i tạ ố ượng
2 Xác đ nh s xu t hi n ban đ u c a đ i tị ự ấ ệ ầ ủ ố ượng
3 Ch ra nó n m đâu.ỉ ằ ở
4 Thêm ph n t vào giao di n trên màn hình.ầ ử ệ
Đ làm vi c v i các đ i tể ệ ớ ố ượng GUI chúng ta c n nh p gói java.awt.*.ầ ậ
AWT cung c p các thành ph n khác nhau đ t o GUI hi u qu , các thành ph n này cóấ ầ ể ạ ệ ả ầ
th là:ể
• V t ch a (Container).ậ ứ
• Thành ph n (Component).ầ
• Trình qu n lý cách trình bày (Layout manager).ả
• Đ ho (Graphics) và các tính năng v (draw).ồ ạ ẽ
• Phông ch (Font).ữ
• S ki n (Event).ự ệ
T phiên b n 1.4, Java phát tri n m t th vi n m r ng m i v i đa s các l p GUI kừ ả ể ộ ư ệ ở ộ ớ ớ ố ớ ế
th a t AWT nh ng có kh năng di đ ng t t h n Các l p GUI trong swing có thêm ti n t “J”ừ ừ ư ả ộ ố ơ ớ ề ố
so v i các l p trong AWT Sau đây, chúng ta s xét các thành ph n GUI trong swing.ớ ớ ẽ ầ
S đ phân c p th a k các đ i tơ ồ ấ ừ ế ố ượng GUI trong swing nh sau:ư
Trang 2II V t ch a (Container) ậ ứ
Là vùng mà ta có th đ t các thành ph n (component) c a giao di n M t v t ch a cóể ặ ầ ủ ệ ộ ậ ứ
th ch a nhi u ph n t V t ch a thể ứ ề ầ ử ậ ứ ường đượ ử ục s d ng là:
• JPanel - khung ch a đ n gi n nh t, đ nhóm các đ i tứ ơ ả ấ ể ố ượng con l i và s p x pạ ắ ế theo cách thích h p.ợ
• JFrame - là m t c a s nh m i ng d ng c a windows, đ t o các ng d ngộ ử ổ ư ọ ứ ụ ủ ể ạ ứ ụ windows
• JDialogs - là c a s nh ng không đ y đ ch c năng nh Frame, nó là c a sử ổ ư ầ ủ ứ ư ử ổ
h p tho i đ a ra nh ng l i thông báo.ộ ạ ư ữ ờ
• JScrollPanel - khung ch a nh Panel nh ng có hai thanh trứ ư ư ượt
II.1 JFrame
T o đ i tạ ố ượng khung ch a JFrame b ng phứ ằ ương th c kh i t o: void JFrame();ứ ở ạ
T o Frame v i tiêu đ bên trên: void JFrame(String FrameTitle);ạ ớ ề
Ví dụ:
JFrame frame1 = new JFrame();
JFrame frame2 = new JFrame("Cua so Frame");
import javax.swing.*;
public class FrameSample {
public static void main(String[] argvs){
JFrame f = new JFrame();
f.setSize(400,400);
f.setVisible(true);
}}
• B hoàn toàn đ i tỏ ố ượng JFrame: frame1.dispose();
• Thay đ i tiêu đ cho JFrame: frame1.setTitle(String newTitle);ổ ề
• L y tiêu đ c a JFrame: public String getTitle();ấ ề ủ
• Co dãn JFrame: public void setResizable(boolean b); trong đó: b = true thì Frame
có th thay đ i kích thể ổ ước, b = false thì không đ i.ổ
• Xác đ nh JFrame đang tình tr ng nào: public boolean isResizable();ị ở ạ
• Thay đ i bi u tổ ể ượng JFrame: public setIconImage(Image img);
II.2 JPanel
JPanel không th nhìn th y tr c ti p, nó là đ i tể ấ ự ế ố ượng dùng đ ch a các thành ph nể ứ ầ GUI trên màn hình Do đó chúng ta c n g n JPanel vào đ i tầ ắ ố ượng nào đó nh : JFrame, JApplet,ư
T o khung ch a JPanel b ng phạ ứ ằ ương th c kh i t o: JPanel panel1 = new JPanel();ứ ở ạ
115
Trang 3Ví d sau t o m t đ i tụ ạ ộ ố ượng JPanel và đ t vào nó m t đ i tặ ộ ố ượng nút b m JButton ấimport javax.swing.*;
public class FrameSample {
public static void main(String[] argvs){
JFrame f = new JFrame();
JPanel p = new JPanel();
II.3 JDialog
Nh JFrame, nh ng ít ch c năng h n, còn đư ư ứ ơ ược g i là popup-window.ọ
Ta có th t o JDialog dể ạ ưới hai hình th c:ứ
• modal: là c a s JDialog khi th c hi n s khoá ch t các c a s khác C a sử ổ ự ệ ẽ ặ ử ổ ử ổ này thường yêu c u m t tác v nào đó c n ph i hoàn thành ngay.ầ ộ ụ ầ ả
• non-modal: ngượ ạ ớc l i v i modal, c a s này thích ng v i các thao tác mangử ổ ứ ớtính tuỳ bi n ế
Cách t o khung ch a JDialog t phạ ứ ừ ương th c kh i t o: ứ ở ạ
public JDialog(JFrame parentWindow, boolean isModal);
trong đó: isModal - quy t đ nh xem JDialog đế ị ượ ạc t o ra d ng nào: isModal = true choở ạmodal còn isModal = false cho non-modal
Ví d : JDialog myDialog = new JDialog(myWindow, true)ụ
T o JDialog có tiêu đ đ nh trạ ề ị ước:
public JDialog(Frame parentWindow, String title, boolean isModal)
JDialog không th g n v i Applet, mu n đ a ra m t JDialog t JApplet ta ph i t o raể ắ ớ ố ư ộ ừ ả ạ
m t JFrame gi t o.ộ ả ạ
Đ a đ i tư ố ượng JDialog ra màn hình b ng phằ ương th c show().ứ
Gi u c a s JDialog ta dùng phấ ử ổ ương th c: hide().ứ
n hi n JDialog ta còn có ph ng th c: setVisible(boolean)
Các đ c đi m thặ ể ường s d ng v i đ i tử ụ ớ ố ượng JDialog th hi n tể ệ ương t v i JFrame.ự ớ
L y và thay đ i kích thấ ổ ước JDialog: public setResizable(boolean), boolean isResizable()
Đ t và l y tiêu đ c a JDialog:ặ ấ ề ủ void setTitle(String), String getTitle();
Xác minh m t JDialog đang thu c d ng nào ta g i phộ ộ ạ ọ ương th c: public booleanứisModal()
Chương trình sau đây s n ho c hi n m t Jdialog m i khi nh t vào m t nút b m:ẽ ẩ ặ ệ ộ ỗ ấ ộ ấ
Trang 4public FrameSample() // Constroctor
{
d = new JDialog(this,"Day la Jdialog",false);
d.setSize(100,100);
JPanel p = new JPanel();
JButton b = new JButton("Xem/Tat mot JDialog");
b.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
d.setVisible(!d.isVisible());
}} );
Trang 5II.4 JScrollPane
Đây không ph i là m t c a s nh ng có tính ch t nh khung ch a JPanel dùng đ ch aả ộ ử ổ ư ấ ư ứ ể ứ các đ i tố ượng Tính ch t khác là khi đ i tấ ố ượng nó ch a quá l n thì JScrollPane s xu t hi nứ ớ ẽ ấ ệ thanh trượ ứt đ ng và ngang hai bên vi n đ ta có th xem đở ề ể ể ược toàn b JScrollPane độ ượ c
ng d ng trong các danh sách ch n
III Gi i thi u v các thành ph n GUI c b n ớ ệ ề ầ ơ ả
• Jlabel: Ch m t vùng hi n th văn b n ho c các icon.ỉ ộ ể ị ả ặ
• JtextField: Ch m t đ i tỉ ộ ố ượng cho phép nh p d li u t bàn phím.ậ ữ ệ ừ
Ví d : Button nutOK = new Button("OK");ụ
Đ nút nh n vào Applet hay c a s chư ấ ử ổ ương trình b ng l nh: add(nutOK);ằ ệ
Đ đ i tên nhãn cho nút nh n ta g i phể ổ ấ ọ ương th c public void setLabel(StringứnewLabel)
Đ xem tên nhãn hi n t i c a nút nh n, ta g i phể ệ ạ ủ ấ ọ ương th c public String getLabel()ứ
Ví d :ụ Button nutOK = new Button(); nutOK.setLabel("OK");
setText(String nameLabel): Đ t l i n i dung m i cho nhãn.ặ ạ ộ ớ
Label.CENTER, Label.LEFT, Label.RIGHT: nh ng giá tr căn l ữ ị ề
L y n i dung hi n hành c a nhãn: public String getText();ấ ộ ệ ủ
Xem nhãn đang được căn l ch đ nào: public int getAlignment();ề ở ế ộ
Thi t l p l i ch đ căn l : public void setAlignment(int align) throwsế ậ ạ ế ộ ềIlligalArgumentException
Sau đây là ví d s d ng JLabel:ụ ử ụ
// Minh h a v JLabelọ ề
// Nh p các gói th vi nậ ư ệ
import java.awt.*;
Trang 6import java.awt.event.*;
// Gói Java m r ngở ộ
import javax.swing.*;
public class LabelTest extends JFrame {
private JLabel label1, label2, label3;
// T o giao di n GUIạ ệ
public LabelTest()
{
super( "Testing JLabel" ); // Contructor c a JFrameủ
// L y đ i tấ ố ượng pane c a m t JFrameủ ộ
Container container = getContentPane();
container.setLayout( new FlowLayout() );
// constructor c a JLabelủ
label1 = new JLabel( "Label with text" );
label1.setToolTipText( "This is label1" ); // hi n th khi di chu t đ nể ị ộ ế
container.add( label1 ); // thêm vào container
// T o Jlabel v i icon ho c textạ ớ ặ
Icon bug = new ImageIcon( "bug1.gif" );
label2 = new JLabel( "Label with text and icon", bug, SwingConstants.LEFT );
label2.setToolTipText( "This is label2" );
container.add( label2 );
// JLabel không tham số
label3 = new JLabel();
label3.setText( "Label with icon and text at bottom" );
Trang 7}
III.3 Nút đánh d u (checkbox) ấ
M t nút đánh d u có hai ph n: nhãn và d u bi u hi n tr ng thái.ộ ấ ầ ấ ể ệ ạ
Ta có th t o nút đánh d u theo 5 phể ạ ấ ương th c kh i d ng:ứ ở ự
• public Checkbox(): t o ô đánh d u không có nhãn.ạ ấ
• public Checkbox(String cbLabel): t o ô đánh d u v i m t nhãn cbLabel g nạ ấ ớ ộ ắ kèm
• public Checkbox(String cbLabel, boolean state): T o ô đánh d u v i m t nhãnạ ấ ớ ộcbLabel g n kèm v i tr ng thái ban đ u c a ô đó.ắ ớ ạ ầ ủ
• public Checkbox(String cbLabel, boolean state, CheckboxGroup g);
• public Checkbox(String cbLabel , CheckboxGroup g, boolean state): dùng đ t oể ạ
ô đánh d u có nhãn v i tr ng thái đánh d u ban đ u, nút t o ra đấ ớ ạ ấ ầ ạ ược nhómtrong nhóm g Nhóm các ô đánh d u tr thành nút ch n.ấ ở ọ
Ki m tra và thi t l p tr ng thái ể ế ậ ạ :
Đ ki m tra m t ô có để ể ộ ược đánh d u không ta dùng phấ ương th c: public booleanứgetState();
N u mu n thi t l p tr ng thái, ta dùng phế ố ế ậ ạ ương th c: setState(boolean state).ứ
X lý tình hu ng khi ô đánh d u thay đ i tr ng thái: ử ố ấ ổ ạ
Đ l ng nghe ô đánh d u, ta dùng phể ắ ấ ương th c: addItemListener(ItemListener L)ứ
Đ lo i b l ng nghe đó ta dùng phể ạ ỏ ắ ương th c: removeItemListener(ItemListener L)ứ
Trang 8// Java core packages
import java.awt.*;
import java.awt.event.*;
// Java extension packages
import javax.swing.*;
public class CheckBoxTest extends JFrame {
private JTextField field;
private JCheckBox bold, italic;
Container container = getContentPane();
container.setLayout( new FlowLayout() );
// Đ t ô nh p và font chặ ậ ữ
field = new JTextField( "Theo dõi font ch thay đ i", 20 );ữ ổ
field.setFont( new Font( "Serif", Font.PLAIN, 14 ) );
// Đăng ký đ i tố ượng l ng ngheắ
CheckBoxHandler handler = new CheckBoxHandler();
private class CheckBoxHandler implements ItemListener {
private int valBold = Font.PLAIN;
private int valItalic = Font.PLAIN;
Trang 9III.4 Nút ch n (radio button) ọ
Ta t o m t đ i tạ ộ ố ượng giao ti p ItemListener đ l ng nghe tình hu ng.ế ể ắ ố
Phương th c getItemSelectable s tr v đ i tứ ẽ ả ề ố ượng n i mà tình hu ng phát sinh:ơ ốpublic ItemSelectable getItemSelectable();
Phương th c getItem c a đ i tứ ủ ố ượng ItemEvent s cho ta bi t giá tr nút ch n:ẽ ế ị ọpublic Object getItem();
Sau đây là ví d v s d ng ô ch n:ụ ề ử ụ ọ
// Đăng ký đ i tố ượng l ng nghe cho m i ô ch n radioắ ỗ ọ
RadioButtonHandler handler = new RadioButtonHandler();
III.5 H p tho i Combo ộ ạ
Java h tr h p tho i Combo thông qua đ i tỗ ợ ộ ạ ố ượng c a class JComboBox Đây là m tủ ộ danh sách x xu ng, đ a ra m t danh sách các m c và ta ch đổ ố ư ộ ụ ỉ ược ch n 1 m c trong đó.ọ ụJComboBox cũng phát sinh s ki n ItemEvent gi ng nh JRadioButton và JCheckBox ự ệ ố ư
Chương trình sau đây minh h a vi c s d ng JComboBox v i các ph n t là các nhọ ệ ử ụ ớ ầ ử ả GIF
// Java core packages
import java.awt.*;
import java.awt.event.*;
// Java extension packages
import javax.swing.*;
public class ComboBoxTest extends JFrame {
private JComboBox imagesComboBox;
private JLabel label;
Trang 10private String names[] = { "bug1.gif", "bug2.gif", "travelbug.gif", "buganim.gif" };
private Icon icons[] = { new ImageIcon(names[0]), new ImageIcon(names[1]), new ImageIcon(names[2]), new ImageIcon(names[3])};
Container container = getContentPane();
container.setLayout( new FlowLayout() );
// đ t m t JLabel hi n thi ImageIcons tặ ộ ể ương ngứ
label = new JLabel( icons[ 0 ] );
III.6 Danh sách (Lists)
L p List cho phép ta t o m t danh sách các ph n t cho ta l a ch nớ ạ ộ ầ ử ự ọ
123
Trang 11T o m t danh sách: ạ ộ
Phương th c kh i d ng m c đ nh: public List() vd: List list = new List();ứ ở ự ặ ị
ho c đ ch đ nh bao nhiêu ph n t s đặ ể ỉ ị ầ ử ẽ ược hi n th cùng m t lúc trong danh sách:ể ị ộpublic List(int rows)
ho c t o m t danh sách cho phép l a ch n nhi u ph n t cùng m t lúc: public List(intặ ạ ộ ự ọ ề ầ ử ộrows, boolean multiMode)
S d ng danh sách ch n: ử ụ ọ
Đ a t ng ph n vào danh sách b ng l nh add(String item).vd: list.add("Mau do");ư ừ ầ ằ ệ
Chèn m t ph n t vào danh sách b ng phộ ầ ử ằ ương th c add(String item, int index), index làứ
Tr v v trí c a ph n t đả ề ị ủ ầ ử ược ch n, n u không có ph n t nào đọ ế ầ ử ược ch n thì giá trọ ị
s là -1: getSelectedIndex() N u đẽ ế ược ch n nhi u thì dùng: int[] getSelectedIndex()ọ ề
L y ra ph n t đấ ầ ử ược ch n: getSelectedItem() Ch n nhi u thì dùng: String[]ọ ọ ềgetSelectedItem()
Đ ch n m t ph n t mà ta bi t v trí: select(int index)ể ọ ộ ầ ử ế ị
N u ph n t đang tr ng thái ch n chuy n sang tr ng thái bình thế ầ ử ở ạ ọ ể ạ ường: deselect(intindex)
Tr ng thái c a m t ph n t : isSelected(int index)ạ ủ ộ ầ ử
Chuy n ch đ đ n ch n sang đa ch n: setMultiplesSelections(boolean bl)ể ế ộ ơ ọ ọ
Cho bi t m t danh sách là đ n ch n hay đa ch n: boolean isMultipleMode().ế ộ ơ ọ ọ
S d ng đ i tử ụ ố ượng danh sách:
Cài đ t giao ti p ItemListener đ t o đ i tặ ế ể ạ ố ượng bi t l ng nghe s thay đ i tr ng tháiế ắ ự ổ ạ
c a các ph n t trong danh sách.ủ ầ ử
S d ng đ i s ItemEvent trong phử ụ ố ố ương th c itemStateChange đ bi t đứ ể ế ược ch s c aỉ ố ủ
ph n t đang thay đ i tr ng thái ầ ử ổ ạ
Đ x lý để ử ược tình hu ng nh p đôi chu t, ta cài đ t giao ti p ActionListener và g n nóố ấ ộ ặ ế ắvào danh sách
Phương th c getActionCommand() trong ActionEvent s tr v tên c a ph n t bứ ẽ ả ề ủ ầ ử ị
public class ListTest extends JFrame {
private JList colorList;
private Container container;
private String colorNames[] = { "Black", "Blue", "Cyan", "Dark Gray", "Gray", "Green",
"Light Gray", "Magenta", "Orange", "Pink", "Red", "White", "Yellow" };
Trang 12private Color colors[] = { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow };
// thêm m t JScrollPane ch a danh sáchộ ứ
container.add( new JScrollPane( colorList ) );
// đ t l ng nghe s ki nặ ắ ự ệ
colorList.addListSelectionListener( new ListSelectionListener() {
public void valueChanged( ListSelectionEvent event )
• Kh i t o m t ô văn b n không xác đ nh kích thở ạ ộ ả ị ước: public TextField();
• T o m t ô văn b n hi n th t i thi u numCols ký t :ạ ộ ả ể ị ố ể ự public TextField(int numCols);
125
Trang 13• T o m t ô văn b n v i n i dung là m t chu i cho trạ ộ ả ớ ộ ộ ỗ ước: public TextFiled(StringinitText);
• T o ô văn b n k t h p: public TextField(String initText, int numCols);ạ ả ế ợ
• T o vùng văn b n:ạ ả
• T o vùng văn b n r ng, kích thạ ả ỗ ước b t kỳ: public TextArea();ấ
• T o m t vùng văn b n v i n i dung cho trạ ộ ả ớ ộ ước: public TextArea(StringinitiaText);
• T o m t vùng văn b n v i s c t và s dòng đ nh trạ ộ ả ớ ố ộ ố ị ước: public TextArea(introws, int cols);
• T o m t vùng văn b n v i s dòng s c t và n i dung cho trạ ộ ả ớ ố ố ộ ộ ước: publicTextArea(String st, int rows, int cols)
Đ c đi m chung c a các thành ph n văn b n ặ ể ủ ầ ả :
Hai l p này đớ ược d n xu t t l p TextComponentẫ ấ ừ ớ
Mu n đ a n i dung văn b n vào các đ i tố ư ộ ả ố ượng này ta s d ng phử ụ ương th c setText:ứpublic void setText(String newText);
L y n i dung văn b n trong các đ i tấ ộ ả ố ượng: public String getText();
L y n i dung văn b n đấ ộ ả ược đánh d u: public String getSelectedText();ấ
Đ xác đ nh xem v trí đánh d u kh i văn b n b t đ u và k t thúc đâu: public intể ị ị ấ ố ả ắ ầ ế ởgetSelectionStart(); //đ uầ
public int getSelectionEnd(); //cu iố
Đánh d u toàn b văn b n: public void selectAll();ấ ộ ả
Cho phép so n th o đạ ả ược: public void setEditable(boolean canEdited); canEdited =
canEdited = true: thêm, s đử ược
Xác đ nh đ i tị ố ượng đang trang thái nào: public boolean isEditable();ở
Đ c đi m riêng c a TextField: ặ ể ủ
Đ t ký t hi n th cho ký t nh p vào: public void setEchoChar(Char ch); ví d :ặ ự ể ị ự ậ ụ myTextField.setEchoChar('*'); //mã mKh uẩ
Xác đ nh xem ký t làm ký t hi n th : public char getEchoChar();ị ự ự ể ị
Xác đ nh chi u dài c a ô văn b n theo ký t : public int getColums();ị ề ủ ả ự
Đ c đi m riêng c a đ i tặ ể ủ ố ượng TextArea:
Đ a thêm m t dòng văn b n vào đ i tư ộ ả ố ượng: public void appendText(String newText);
Chèn m t chu i văn b n vào v trí b t kỳ: public void insertText(String newText, intộ ỗ ả ị ấpos);
Xác đ nh kích thị ước hi n th :ể ị public int getRows(); public int getColums();
S d ng đ i tử ụ ố ượng TextField và TextArea:
Mu n l y n i dung văn b n c a đ i tố ấ ộ ả ủ ố ượng, ta thi t l p ActionListener đ g n đ iế ậ ể ắ ố
tượng x lý tình hu ng vào văn b n TextField Khi ngử ố ả ười dung nh n Enter thì tình hu ngấ ố
được g i.ọ
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextFieldTest extends JFrame {
private JTextField textField1, textField2, textField3;
private JPasswordField passwordField;