Tải bản đầy đủ (.pdf) (23 trang)

Lập trình giao diện đồ họa GUI

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (686.65 KB, 23 trang )

Đề 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:

114


II. 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);
}
}
Một số phương thức hay sử dụng:
• Đặt lại kích thước cho JFrame: frame1.setSize(int width, int height);
• Đưa cửa sổ hiện ra màn hình:
frame1.show();
frame1.setVisible(boolean b); trong đó: b = true cho hi ển th ị, b = false cho
ẩn.
• Bỏ hồn tồ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


Ví 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();
p.add(new JButton("OK"));
f.add(p); // gắn JPanel vào JFrame
f.setSize(400,400);
f.setVisible(true);
}
}
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 hồ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:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class FrameSample extends JFrame
{ private JDialog d;

116



public 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());
}
}
);
p.add(b);
add(p);
}
public static void main(String[] argvs)
{
FrameSample fs = new FrameSample();
fs.setSize(400,400);
fs.setVisible(true);
}
}

117


II.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 tồ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.
JButton: Đối tượng nút bấm
JcheckBox: Đối tượng nút chọn.
JcomboBox: Đối tượng ComboBox
Jlist: Danh sách
JPanel: Nơi đặt các thành phần GUI nói trên.

III.1 Nút nhấn
Cách tạo nút nhấn
Ta gọi phương thức khởi dựng: public Button(String label) label là tên nhãn c ủa nút

nhấn
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");
Sử dụng nút nhấn
Khi kích chuột vào nút nhấn sẽ thực hiện một cơng vi ệc nào đó. Vấn đ ề này chúng ta
đã xem xét trong phần xử lý các sự kiện

III.2 Nhãn (Label)
Tạo nhãn khơng có nội dung gì: public Label() ho ặc tạo nhãn có n ội dung: public
Label(String nameLabel).
hoặc thêm chế độ căn lề: pubic Label(String name, int align)
Một số phương thức hay sử dụng:
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.*;
118


import 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" );
label3.setIcon( bug );
label3.setHorizontalTextPosition( SwingConstants.CENTER );
label3.setVerticalTextPosition( SwingConstants.BOTTOM );
label3.setToolTipText( "This is label3" );
container.add( label3 );
setSize( 275, 170 );
setVisible( true );
}
// hàm main
public static void main( String args[] )
{
LabelTest application = new LabelTest();

application.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );
}
119


}

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óm
trong 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)

120



// 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;
// Thiết lập GUI
public CheckBoxTest()
{
super( "JCheckBox Test" );
// lấy pane
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 ) );
container.add( field );
// tạo đối tượng checkbox
bold = new JCheckBox( "Bold" );
container.add( bold );
italic = new JCheckBox( "Italic" );
container.add( italic );
// Đăng ký đối tượng lắng nghe
CheckBoxHandler handler = new CheckBoxHandler();
bold.addItemListener( handler );
italic.addItemListener( handler );
setSize( 275, 100 );

setVisible( true );
}
// execute application
public static void main( String args[] )
{
CheckBoxTest application = new CheckBoxTest();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// Lớp nội lắng nghe sự kiện
private class CheckBoxHandler implements ItemListener {
private int valBold = Font.PLAIN;
private int valItalic = Font.PLAIN;
// Đáp ứng sự kiện chọn ô
public void itemStateChanged( ItemEvent event )
{
// xử lý chọn ô chữ đậm
if ( event.getSource() == bold )
if ( event.getStateChange() = = ItemEvent.SELECTED )
valBold = Font.BOLD;
else
valBold = Font.PLAIN;
// Chọn ô chứ nghiêng
if ( event.getSource() == italic )

121


III.4 Nút chọn (radio button)
Tạo nút chọn:
Đây là trường hợp đặc biệt của ô đánh dấu. Ta tạo ra ô đánh dấu và đ ặt nó vào m ột

nhóm, ta có phương thức sau: public CheckboxGroup();
Với một nhóm các nút ta có thể lấy ra đối tượng hi ện t ại đang đ ược ch ọn b ằng cách
gọi phương thức getSelectedCheckbox().
Đặt lựa chọn ta dùng: setSelectedCheckbox().
Cách sử dụng nút chọn:
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();
plainButton.addItemListener( handler );
boldButton.addItemListener( handler );
italicButton.addItemListener( handler );
boldItalicButton.addItemListener( handler );
// Nhóm các ơ lại
radioGroup = new ButtonGroup();
radioGroup.add( plainButton );
radioGroup.add( boldButton );
radioGroup.add( italicButton );
radioGroup.add( boldItalicButton );
Về bắt các sự kiện cũng tương tự ô đánh dấu.
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;

122


private 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])};
// Thiết lập GUI
public ComboBoxTest()
{
super( "Testing JComboBox" );
// Đặt layout
Container container = getContentPane();
container.setLayout( new FlowLayout() );
// khởi tạo combo
imagesComboBox = new JComboBox( names );
imagesComboBox.setMaximumRowCount( 3 );
imagesComboBox.addItemListener( new ItemListener() {
// bắt sự kiện
public void itemStateChanged( ItemEvent event )
{
// liệu có phần tử được chọn

if ( event.getStateChange() == ItemEvent.SELECTED )
label.setIcon( icons[imagesComboBox.getSelectedIndex() ] );
} } );
container.add( imagesComboBox );
// đặt một JLabel hiển thi ImageIcons tương ứng
label = new JLabel( icons[ 0 ] );
container.add( label );
setSize( 350, 100 );
setVisible( true );
}
// hàm main
public static void main( String args[] )
{
ComboBoxTest application = new ComboBoxTest();
aplication.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}}
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


Tạ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à
vị trí phần tử mà ta muốn chèn.
Thay thế một phần tử ở vị trí pos bằng phần tử mới: replaceItem(String newItem, int
pos)
vd: list.replaceItem("Xanh", 4);
Loại bỏ một phần tử trong danh sách ta dùng phương thức remove(int pos).
Loại bỏ hết danh sách: removeAll().
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(int
index)
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 ị
nhấp.
// Java core packages
import java.awt.*;
// Java extension packages
import javax.swing.*;

import javax.swing.event.*;
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" };

124


private 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 };
// Thiết lập GUI
public ListTest()
{
super( "List Test" );
// lấy layout
container = getContentPane();
container.setLayout( new FlowLayout() );
// Tạo danh sách
colorList = new JList( colorNames );
colorList.setVisibleRowCount( 5 );
// Không cho chọn nhiều
colorList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION );
// 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 )

{
container.setBackground( colors[ colorList.getSelectedIndex() ] );
} } );
setSize( 350, 150 );
setVisible( true );
}
// hàm main
public static void main( String args[] )
{
ListTest application = new ListTest();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}}
III.7 Ô văn bản (text field) và vùng văn bản (text areas)
Tạo ơ văn bản:
• Khởi tạo một ơ văn bản khơng xác định kích thước:
• Tạo một ô văn bản hiển thị tối thiểu numCols ký tự:
numCols);

public TextField();
public TextField(int

125




Tạo một ô văn bản với nội dung là một chuỗi cho trước: public TextFiled(String
initText);
• 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(String
initiaText);
• Tạo một vùng văn bản với số cột và số dòng định tr ước: public TextArea(int
rows, 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: public
TextArea(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 =
false:
chỉ
đọc.
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;
126


// Thiết lập giao diện GUI
public TextFieldTest()
{
super( "Testing JTextField and JPasswordField" ); // constructor của JFrame
Container container = getContentPane();
container.setLayout( new FlowLayout() );
// ơ nhập với kích thước mặc định
textField1 = new JTextField( 10 );
container.add( textField1 );

// ô nhập với văn bản có sẵn
textField2 = new JTextField( "Enter text here" );
container.add( textField2 );
// ô nhập không cho phép nhập, chỉ hiên thị thông tin
textField3 = new JTextField( "Uneditable text field", 20 );
textField3.setEditable( false );
container.add( textField3 );
// ô nhập password
passwordField = new JPasswordField( "Hidden text" );
container.add( passwordField );
// Đăng ký bộ lắng nghe sự kiện
TextFieldHandler handler = new TextFieldHandler();
textField1.addActionListener( handler );
textField2.addActionListener( handler );
textField3.addActionListener( handler );
passwordField.addActionListener( handler );
setSize( 325, 100 );
setVisible( true );
}
// hàm main
public static void main( String args[] )
{
TextFieldTest application = new TextFieldTest();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// Lớp nội cho bộ lắng nghe sự kiện
private class TextFieldHandler implements ActionListener {
// phương thức xử lý sự kiện
public void actionPerformed( ActionEvent event )
{

String string = "";
// khi người dùng ấn enter
127


if ( event.getSource() == textField1 )
string = "textField1: " + event.getActionCommand();
// user pressed Enter in JTextField textField2
else if ( event.getSource() == textField2 )
string = "textField2: " + event.getActionCommand();
// user pressed Enter in JTextField textField3
else if ( event.getSource() == textField3 )
string = "textField3: " + event.getActionCommand();
// user pressed Enter in JTextField passwordField
else if ( event.getSource() == passwordField ) {
JPasswordField pwd = ( JPasswordField ) event.getSource();
string = "passwordField: " + new String( passwordField.getPassword() );
}
JOptionPane.showMessageDialog( null, string ); // Hiên thị cửa sổ thơng báo
}
}
}

III.8 Thanh trượt (Scrollbar)
Ta có thể đặt thanh trượt các giá trị giới hạn tối thiểu (min) và tối đa (max) cùng v ới v ị
trí hiện tại trên thanh trượt.
Khi người dùng kích chuột vào mũi tên ở hai đầu thì tình hu ống line n ảy sinh, thanh
trượt sẽ tự động cộng thêm hay trừ đi một đơn vị.
Tình huống page nảy sinh khi người dùng kích chuột vào khoảng gi ữa thanh tr ượt, v ị
trí hiện hành sẽ thay đổi.

Tình huống absolute nảy sinh khi người dùng nắm vào vị trí hiện hành của thanh tr ượt
và kéo nó đi.
Đối tượng Scrollbar chỉ chịu trách nhiệm di chuyển và cung cấp cho ta giá trị thay đổi.
Tạo thanh trượt:
Phương thức khởi tạo: public Scrollbar();
Tạo thanh trượt đứng hay ngang ta dùng: public Scrollbar(int orienttation); orienttation
nhận giá trị Scrollbat.VERTICAL - cho đứng, Scrollbar.HORIZONTAL cho nằm ngang.
Tạo thanh trượt có đầy đủ thơng số ban đầu:
public Scrollbar(int orienttation,
int pos, //vị trí khởi đầu
int pageUnit, //bước nhảy
int minValue, //giá trị min
int maxValue); //giá trị max
Một số phương thức hay dùng:
Thay đổi giá trị tăng giảm (mặc định là 1): public void setUnitIncrement(int increment);
Muốn biết hiện thời tăng giảm bao nhiêu: public int getUnitIncrement()

128


Chỉ định con số khi tình huống page xảy ra: pubic void setBlockIncrement(int b);
Muốn biết hiện thời đơn vị thay đổi là bao nhiêu: public int getBlockIncrement();
Lấy giá trị lớn nhất và nhỏ nhất: public int getMaximum(); public int getMinimum();
Đặt lại vị trí hiện hành cho thanh trượt: public void setValue(int newPos);
Cho ta vị trí hiện hành: public int getValue();
Muốn biết thanh trượt đứng hay ngang: public int getOrientation() trả v ề giá tr ị là m ột
trong hai hằng số Scrollbar.VERTICAL và Scrollbar.HORIZONTAL.
Thiết lập lại các thông số cho thanh trượt: public void setValues(int position, int
pageUnit, int minimum, int maximum);
ví dụ: myScrollbar.setValues(75, 10, 0, 500);

Sử dụng thanh trượt:
Ta
nhờ
đối
tượng
xử

tình
huống
xử
lý:
public
void
adjustmentValueChanged(AdjustmentEvent evt);
Có 3 trạng thái: line, page và absolute. Ta sử dụng hàm getAdjustmentType() đ ể xác
định xem tình huống nào đang xảy ra.
AdjustmentEvent.UNIT_INCREMENT: tình huống line xảy ra, v ị trí thanh tr ượt tăng 1
đơn vị.
AdjustmentEvent.UNIT_DECREMENT: tình huống line xảy ra, v ị trí thanh tr ượt gi ảm
1 đơn vị.
AdjustmentEvent.BLOCK_INCREMENT: tình huống page xảy ra, vị trí hi ện hành tăng
1 đv.
AdjustmentEvent.Track: tình huống absolute xảy ra, ta lấy vị trí thanh tr ượt b ằng hàm
getValue().

IV. Thành phần Menu
Lớp JMenuBar cài đặt thanh thực đơn và trong đó có thể chứa các th ực đ ơn pull-down.
Các JMenuBar được tạo ra để gắn vào một của sổ JFrame bằng một lệnh gọi:
JMenuBar menuBar = new JMenuBar();
JFrame frm = new JFrame(“Day la mot Frame”);

frm.setJMenuBar(menuBar); // MenuBar này chưa có phần tử nào
Sau khi có MenuBar, ta cần thêm vào đó các JMenu là các m ục trên thanh Menu, khi
người dùng chọn vào đó sẽ sổ xuống danh sách các mục chọn khác.
JMenu file = new JMenu(“File”);
Ta đặt cho nó một phím tắt, ví dụ là ‘F’ để khi ấn Alt + F thì JMenu này đ ược kích
hoạt:
file.setMnemonic('F');
Sau đó thì thêm nó vào JMenuBar: menuBar.add(file);
Bây gời là lúc ta cài đặt các mục chọn trong m ột JMenu. Java dùng l ớp JMenuItem đ ịnh
nghĩa từng mục của thực đơn.
JMenuItem open = new JMenuItem(“Open”,’O’);
Ở đây ta đã gọi một constructor với một tham số là nhãn của mục chọn, một tham số là
ký tự phím tắt. Sau đó ta add vào JMenu:
file.add(open);
Nếu ta cần biểu diễn các dòng kẻ ngang để phân tách các mục ch ọn thì ta có th ể g ọi
phương thức addSeparator() của một đối tượng JMenu:
file.addSeparator();

129


Lớp JPopUpMenu biểu diễn cho thực đơn pop-up. Những thực đơn này có th ể xu ất
hiện bất cứ vị trí nào trong cửa sổ hiện tại.
Lớp JCheckBoxMenuItem chứa các mục được chọn để kiểm tra trong các m ục th ực
đơn.
Tạo thanh trình đơn: JMenuBar myMenubar = new JMenuBar();
Đặt trạng thái cho mỗi mục chọn sử dụng enable() hoặc disable():
Vi dụ: openItem.enable(); //được chọn
openItem.disable(); //mờ mục chọn
Ta có thể dùng đường phân cách để tách các mục chọn:

FileMenu.addSeparator();
Tạo mục chọn có chứa menu con khác, ta tạo m ột menu bình th ường r ồi đ ưa vào
menu đã có.
Ví dụ:
//tạo mục chọn có menu con
JMenu printItem = new JMenu("Print");
//tạo các mục chọn cho menu con
printItem.add("Print preview");
printItem.add("to preview");
//đưa mục chọn có menu con vào menu chính
FileMenu.add(printItem);
Tạo một mục chọn có khả năng đánh dấu (check Item), một dấu kiểm tra (check mark)
sẽ hiện bên trái mục chọn:
Mục đánh dấu: CheckboxMenuItem Autosave = new CheckboxMenuItem("Auto save");
FileMenu.add(Autosave);
Xác định xem mục chọn Autosave đang ở trạng thái nào, ta dùng: Autosave.getState();
Khi sử dụng, để mục chọn tương tác và nhận được sự kiện ta cần cài đặt giao di ện
ActionListener và gắn vào từng mục chọn.
Sau đây là một ví dụ xây dựng một JFrame với thanh menu và các m ục ch ọn trong đó
có cài đặt xử lý các sự kiện.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MenuBarSample extends JFrame {
//Khai bao mot hop thoai
JOptionPane op = new JOptionPane();
// Khai bao mot thuc don pop-up
JPopupMenu jp;
public MenuBarSample()
{

// Lay ve doi tuong chua cua Frame hien tai
Container pane = this.getContentPane();
// Dat kieu trinh bay
pane.setLayout(new FlowLayout(FlowLayout.LEADING));
// Khai bao mot thanh menu
JMenuBar menuBar= new JMenuBar();
// Khai bao muc File trong thanh menu
JMenu menuFile= new JMenu("File");menuBar.add(menuFile);
130


// Dat ky tu kich hoat tat cung Alt
menuFile.setMnemonic('F');
// Khai bao mot muc chon voi phim tat O
JMenuItem fileOpen = new JMenuItem("Open",'O');
// Them muc chon vao muc File
menuFile.add(fileOpen);
// Them mot muc chon khac voi phim tat N
menuFile.add(new JMenuItem("New",'N'));
// Them dong ngan cach
menuFile.addSeparator();
// Them mot muc chon co ten Save
menuFile.add("Save");
// Xu ly su kien chon muc Open
fileOpen.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
// Hien thi thong bao, getContentPane() de lay Container cua Frame
op.showMessageDialog(getContentPane(),"Ban vua chon Open");

}
} );
// Xu ly su kien chon New
menuFile.getItem(1).addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
op.showMessageDialog(getContentPane(),"Ban vua chon New");
}
} );
// Xu ly su kien chon Save
menuFile.getItem(3).addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
op.showMessageDialog(getContentPane(),"Ban vua chon Save");
}
} );
// Khai bao mot muc chon kieu checkbox
JCheckBoxMenuItem chk = new JCheckBoxMenuItem("is editting");
// Them phan xu ly su kien chon hay khong chon cho no
chk.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// Lay ve doi tuong nguon su kien va ep kieu
JCheckBoxMenuItem ck = (JCheckBoxMenuItem)e.getSource();
if (ck.isSelected())
131



//Neu duoc chon
op.showMessageDialog(getContentPane(),"Ban vua chon is editting");
else
// Neu khong duoc chon
op.showMessageDialog(getContentPane(),"Ban vua bo chon is editting");
}
} );
// Them muc chon checkbox vao menu File
menuFile.add(chk);
// Dat thanh Menu cho Frame la doi tuong menuBar
this.setJMenuBar(menuBar);
// Cap phat bo nho cho popup menu
jp = new JPopupMenu("Popup");
jp.add("Create");
jp.addSeparator();
jp.add("New Document");
this.addMouseListener( new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if( (e.getModifiers() & InputEvent.BUTTON3_MASK)== InputEvent.BUTTON3_MASK)
jp.show(getContentPane(),e.getX(),e.getY());
}
}
);
}
public static void main(String[] argvs)
{
MenuBarSample m = new MenuBarSample();

m.setSize(300,400);
m.setVisible(true);
}
}

V. Bộ quản lý cách trình bày (Layout Manager)
Dùng để sắp xếp chỗ và định vị cho các đối tượng GUI.
Có 5 cách trình bày:
• FlowLayout: sắp xếp các đối tượng từ trái qua phải và từ trên xuống d ưới. Các
đối tượng giữ ngun kích thước.
• GridLayout: tạo một khung lưới vơ hình với các ơ bằng nhau, các đối tượng sẽ
đặt vừa kích thước với các ơ đó.
• BorderLayout: Các đối tượng được đặt theo đường viền của khung chứa theo
các cạnh West, East, South, Nort và Center.
• CardLayout: Các đối tượng được đặt vừa vặn với khung chứa và n ằm ch ồng
lên nhau như các lá bài.
132




GridBadLayout: các đối tượng trong khung chứa cũng được đ ưa vào các ơ c ủa
một khung lưới vơ hình, kích thước các đối tượng khơng nhất thiết ph ải v ừa
một ô.
Muốn áp dụng ta tạo ra đối tượng trên rồi chuyển nó cho khung chứa.
Ví du: FlowLayout objectsLayout = new FlowLayout();
myWindow.setLayout(objectsLayout);
hay có thể viết gọn hơn:
myWindow.setLayout(new FlowLayout());
V.1 Cách trình bày FlowLayout:

Tạo đối tượng FlowLayout, ta sử dụng phương thức: public FlowLayout();
hoặc chỉ định luôn cách căn lề bằng phương thức khởi tạo: public FlowLayout(int
align);
align là FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER ho ặc ch ỉ ra kho ảng các
giữa các đối tượng trên cùng một hàng: public FlowLayout(int align, int hgap, int vgap);
V.2 Cách trình bày GridLayout:
Phương thức khởi tạo: public GridLayout(int Rows, int Cols);
Ví dụ: GridLayout layout = new GridLayout(3, 2);
Xác định khoảng cách giữa các đối tượng quản lý:
public GridLayout(int Rows, int Cols, int hgap, int vgap);
V.3 Cách trình bày BorderLayout
Đối tượng được đặt theo đường viền khung chứa, theo các cạnh của khung.
Tạo bộ quản lý kiểu BorderLayout: public BorderLayout();
Ví dụ: myWindow.setLayout(new BorderLayout());
Khi đưa đối tượng vào khung chứa, ta phải định hình trước đối tượng đó đặt ở đâu:
myWindow.add("North", new Button("on Top"));
có 5 kiểu: "North", "South", "West", "East", "Center".

VI. Các hộp thoại
VI.1 Hộp thoại thông báo
Khi cần đưa ra thông báo hay hỏi người dùng một vấn đ ề gì đó và nh ận v ề câu tr ả l ời,
ta dùng hộp thoại thông báo. Java hỗ trợ lớp JOptionPane để ta thực hiện công việc này.
Lớp JOptionPane có 4 phương thức tĩnh sau:
Tên phương thức

Giá trị trả
về

Ý nghĩa


showMessageDialog Khơng có

Hiển thị một thơng báo và đợi ấn OK

showConfirmDialog Số int

Hiển thị thông báo và đợi xác nhận Ok hay Cancel

showOptionDialog

Số int

Hiển thị thông báo và nhận về trả lời từ một danh sách
chọn

showInputDialog

Chuỗi

Hiển thị thông báo và nhận về một dòng do user nhập vào

133



×