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:
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);
// 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())
//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 nguyờn 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.ư
• 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ọ
icon hi n th ph thu c vào lo i thụng bỏo:ể ị ụ ộ ạ ERROR_MESSAGE : Thụng bỏo l iỗ INFORMATION_MESSAGE : Thụng tin WARNING_MESSAGE :C nh bỏoả QUESTION_MESSAGE: H iỏ PLAIN_MESSAGE: Gi i thớchả
Cỏc h ng s này đằ ố ược truy c p qua JOptionPane.ậ Vớ d :ụ
int selection = JOptionPane.showConfirmDialog(parent, "Message", "Title", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if (selection == JOptionPane.OK_OPTION) . . .
VI.2 H p tho i ch n Fileộ ạ ọ
Khi vi t ng d ng ta g p cỏc tỡnh hu ng m file đ đ c ho c ghi. Swing h tr m tế ứ ụ ặ ố ở ể ọ ặ ỗ ợ ộ l p JFileChooser đ ta th c hi n cụng vi c này. Hai phớ ể ự ệ ệ ương th c quan tr ng là:ứ ọ
- showOpenDialog: Đ hi n th h p tho i ch n m fileể ệ ị ộ ạ ọ ở - showSaveDialog: Đ hi n th h p tho i ch n ghi fileể ệ ị ộ ạ ọ Sau đõy là cỏc bước đ làm vi c v i h p tho i ch n file:ể ệ ớ ộ ạ ọ
1- T o m t đ i tạ ộ ố ượng JFileChooser: JFileChooser chooser = new JFileChooser(); 2- Đ t th m c cho h p tho i: chooser.setCurrentDirectory(new File("."));ặ ư ụ ộ ạ
3- N u đ nh ch n trế ị ọ ước m t file, cú th đ t: chooser.setSelectedFile(newộ ể ặ File(filename));
4- Đ cho phộp ch n nhi u file: chooser.setMultiSelectionEnabled(true);ể ọ ề
5- N u mu n gi i h n ki u file, dựng b l c file. Đ dựng đế ố ớ ạ ể ộ ọ ể ược b l c file ta ph iộ ọ ả thi t k m t l p k th a t l p javax.swing.filechooser.FileFilter. Vớ d b l c file Gif:ế ế ộ ớ ế ừ ừ ớ ụ ộ ọ
public class GifFilter extends FileFilter {
public boolean accept(File f) {
return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory(); }
public String getDescription() {
return "GIF Image"; }
}
Sau đú gỏn cho h p tho i: chooser.setFileFilter(new GifFilter());ộ ạ
6- M c đ nh thỡ ch cho phộp ch n file, n u mu n cho phộp ch n th m c dựng phặ ị ỉ ọ ế ố ọ ư ụ ương th c: setFileSelectionMode() v i cỏc tham s : JFileChooser.DIRECTORIES_ONLY ho cứ ớ ố ặ JFileChooser.FILES_AND_DIRECTORIES.
7- Hi n th h p tho i b ng l nh g i:ể ị ộ ạ ằ ệ ọ
int result = chooser.showOpenDialog(parent); ho cặ
int result = chooser.showSaveDialog(parent);
Cỏc giỏ trị trả về là JFileChooser.APPROVE_OPTION,
JFileChooser.CANCEL_OPTION, or JFileChooser.ERROR_OPTION
8- L y vố file ho c cỏc file đấ ặ ược ch n dựng: getSelectedFile() ho c getSelectedFiles().ọ ặ Neus ch mu n l y tờn file thỡ ta dựng phỉ ố ấ ương th c getPath().ứ
String filename = chooser.getSelectedFile().getPath();
VI.3 H p tho i ch n màuộ ạ ọ
Swing h tr l p JColorChooser đ ngỗ ợ ớ ể ười dựng ch n màu. Cỳ phỏp s d ng nh sau:ọ ử ụ ư Color selectedColor = JColorChooser.showDialog(parent,title, initialColor);
Khi làm vi c v i h p tho i ch n màu ta c n cung cõp:ệ ớ ộ ạ ọ ầ - parent: m t companent cha; ộ
- title: Tiờu đ h p tho i; ề ộ ạ
- ch đ h p tho i modal hay modeless; ế ộ ộ ạ - m t đ i tộ ố ượng ch n màu ọ
- b l ng nghe cho nỳt b m Ok và Cancel.ộ ắ ấ chooser = new JColorChooser();
dialog = JColorChooser.createDialog(parent,"Background Color", false /* not modal */, chooser, new ActionListener() // L ng nghe cho OKắ
{
public void actionPerformed(ActionEvent event) {
setBackground(chooser.getColor()); }
},
null /* Khụng cú l ng nghe cho Cancel */);ắ
Bài t pậ
2. Hóy l p trỡnh đ x lý s ki n click chu t ph i lờn n n c a s s hi n m t menu Popup.ậ ể ử ự ệ ộ ả ề ủ ổ ẽ ệ ộ 3. Vi t chế ương trỡnh gi i phả ương trỡnh b c 2 v i giao di n GUI. Yờu c u chậ ớ ệ ầ ương trỡnh cú cỏc ụ nh p cỏc h s a, b, c và cho phộp xem k t qu . Trậ ệ ố ế ả ường h p khụng cú nghi m s hi n thợ ệ ẽ ể ị m t h p tho i thụng bỏo “chộ ộ ạ ương trỡnh vụ nghi m”.ệ
Đ tài 11. Threadingề
Java là ngụn ng thụng d ng duy nh t h tr cho l p trỡnh viờn cỏc gi i phỏp l p trỡnhữ ụ ấ ỗ ợ ậ ả ậ song song. L p trỡnh viờn xỏc đ nh s lậ ị ố ượng cỏc thread được ch y trong chạ ương trỡnh và chỳng được th c hi n song song v i nhau nh ng giai đo n nào. Kh năng này c a Java g i là tớnhự ệ ớ ở ữ ạ ả ủ ọ đa lu ng.ồ
I. Khỏi ni m threadệI.1 Khỏi ni m:ệ I.1 Khỏi ni m:ệ
Thread – lu ng ch m t đ n v chồ ỉ ộ ơ ị ương trỡnh cú th tỏch kh i cỏc ph n khỏc c aể ỏ ầ ủ chương trỡnh đ th c hi n song song v i cỏc ph n khỏc t ng kho ng th i gian ho c trongể ự ệ ớ ầ ở ừ ả ờ ặ toàn b quỏ trỡnh nú th c hi n. ộ ự ệ
Trong m i chỗ ương trỡnh Java, cú m t lu ng chớnh độ ồ ược b t đ u b ng vi c g i hàmắ ầ ằ ệ ọ main(), cỏc lu ng khỏc cú th phỏt sinh t lu ng chớnh này. Cỏc cõu l nh trong hàm main() n uồ ể ừ ồ ệ ế khụng được đ a vào m t lu ng riờng thỡ s đư ộ ồ ẽ ược th c hi n tu n t .ự ệ ầ ự
I.2. L p Threadớ
L p Thread trong gúi java.lang cú m t s constructor:ớ ộ ố Public Thread (<tờn thread>)
Public thread(): Khi này thread s cú tờn là Thread_1, Thread_2,….ẽ
Cỏc cụng vi c c a m t thread đệ ủ ộ ược đ t trong phặ ương th c run(). Phứ ương th c này cúứ th để ược khai bỏo ch ng trong l p khai bỏo k th a Thread ho c khai bỏo cài đ t giao di nồ ớ ế ừ ặ ặ ệ Runable.
Ngườ ậi l p trỡnh b t đ u m t thread b ng cỏc g i phắ ầ ộ ằ ọ ương th c start(), phứ ương th cứ start() sau đú s g i run(). Sau khi start() th c hi n xong, nú tr v đi u khi n cho chẽ ọ ự ệ ả ề ề ể ương trỡnh g i nú. Do đú, chọ ương trỡnh g i nú và thread đọ ược th c hi n m t cỏch đ ng th i.ự ệ ộ ồ ờ
• Phương th c start() s nộm ra m t ng o i l IllegalThreadStateException n uứ ẽ ộ ạ ệ ế thread c n b t đ u đó b t đ u r i.ầ ắ ầ ắ ầ ồ
• Phương th c tĩnh sleep c a Thread đứ ủ ược g i v i m t tham s xỏc đ nh r ngọ ớ ộ ố ị ằ m t thread đang ch y s d ng l i trong bao lõu theo đ n v ph n nghỡn giõy.ộ ạ ẽ ừ ạ ơ ị ầ Trong khi m t thread “sleep”, nú s khụng tiờu t n tài nguyờn CPU và threadộ ẽ ố khỏc cú th ch y.ể ạ
• Phương th c interrupt() đứ ược g i đ đ ng t m t thread. Phọ ể ể ắ ộ ương th c này trứ ả v true n u ng t thành cụng. Phề ế ắ ương th c isInterrupted() dựng đ ki m tra xemứ ể ể thread cú b ng t hay khụng.ị ắ
• Phương th c isAlive() tr v true n u start() đó đứ ả ề ế ược g i và phọ ương th c run()ứ v n đang th c hi n.ẫ ự ệ
• Phương th c setName() đ t tờn cho m t thread, getName() l y tờn m t thread.ứ ặ ộ ấ ộ Phương th c toString() tr v tờn phứ ả ề ương th c, đ u tiờn và nhúm c a thread.ứ ộ ư ủ • Phương th c static currentThread() tr v tham chi u t i thread hi n hành đangứ ả ề ế ớ ệ
th c hi n.ự ệ
• Phương th c joint đ i (ứ ợ wait) m t ph n h i c a m t thụng đi p độ ả ổ ủ ộ ệ ược g i điử trước khi th c hi n thread.ự ệ
I.3 Cỏc bước đ t o m t threadể ạ ộ
Sau đõy là cỏc bước đ n gi n đ th c hi n m t nhi m v trong m t thread riờng:ơ ả ể ự ệ ộ ệ ụ ộ 1. Khai bỏo m t l p cú cài đ t giao di n Runable v i phộ ớ ặ ệ ớ ương th c run() đứ ược đ nhị nghĩa:
class MyRunnable implements Runnable {
public void run() {
// code th c hi nự ệ }
}
2. T o m t đ i tạ ộ ố ượng c a l pủ ớ Runnable r = new MyRunnable();
3. T o m t đ i tạ ộ ố ượng Thread t đ i từ ố ượng Runable trờn: Thread t = new Thread(r);
4. G i phọ ương th c start()ứ t.start();
M t thread cũng cú th độ ể ượ ạc t o ra b ng cỏch xõy d ng m t l p con c a l p Thread:ằ ự ộ ớ ủ ớ class MyThread extends Thread
{
public void run() {
// code c a threadủ }
}
Sau đú ta cũng làm theo cỏc bước 2,3 và 4 đ th c hi n thread.ể ự ệ
II. Cỏc tr ng thỏi c a thread.ạ ủ
• Tr ng thỏi born: Khi thread ch a g i start().ạ ư ọ
• Tr ng thỏi ready: Khi phạ ương th c start() đứ ược g i.ọ
• Tr ng thỏi running: M t Thread tr ng thỏi ready cú quy n u tiờn cao nh t sạ ộ ở ạ ề ư ấ ẽ được chuy n sang tr ng thỏi này.ể ạ
• Tr ng thỏi dead: Khi m t Thread ng ng ho c hoàn thành nhi m v c a nú.ạ ộ ư ặ ệ ụ ủ Ngoài ra, m t thread running cũng cú th b ch n (blocked) trong cỏc thao tỏc vào ra.ộ ể ị ặ Lỳc này nú cũng khụng s d ng tài nguyờn CPU.ử ụ
• Tr ng thỏi sleep: Khi Thread g i phạ ọ ương th c sleep. N u đang tr ng thỏi sleepứ ế ở ạ mà g i phọ ương th c interrupt(), tread s thoỏt kh i tr ng thỏi sleep và chuy nứ ẽ ỏ ạ ể sang tr ng thỏi ready.ạ