Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica Kh Khốối:i: ĐạĐại Hi Họọc vàc và Cao ĐẳCao Đẳngng Năm 201 Năm 20166 Hướ Hướ ng dng dẫẫn:n:
Bài tBài tậậ p th p thực hành đượ ực hành đượ c chia theo Modulec chia theo Module
MMỗỗi Modulei Module đượ đượ c thic thiếết k t k ếế cho th cho thời lượ ời lượ ng là 6 ting là 6 tiếết tht thựực hành tc hành tạại li lớ ớ p v p vớ ớ i si sựự
hướ
hướ ng dng dẫẫn cn củủa gia giảảng viên.ng viên.
Tùy theo sTùy theo sốố ti tiếết phân bt phân bổổ, m, mỗỗi tui tuầần hn họọc có thc có thểể th thựực hic hiệện nhin nhiềều Module.u Module.
Sinh viên phSinh viên phảải làm ti làm tấất t ccảả các bài t các bài tậậ p p trong trong các các ModuleModule ở ở tutuần tương ứần tương ứng.ng. Nh
Những sinh viên chưa hòan tấững sinh viên chưa hòan tất t phphầần bài tn bài tậậ p p ttạại lli ớ ớ p p có có trách trách nhinhiệệm m ttựự làm làm ti
tiếế p t p tụụcc ở ở nhà. nhà.
Các bài có dCác bài có dấấu (*) là các bài tu (*) là các bài tậậ p nâng ca p nâng cao dành cho o dành cho sinh viên khá sinh viên khá gigiỏỏi.i.
Th
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica Trang 2 Trang 2
Mục lục
Mục lục
Module 1 :
Module 1 :
Ôn tập Graphic User Interface
Ôn tập Graphic User Interface
. ... ... ... 33Module 2: Thực hành về
Module 2: Thực hành về
MultiThreadinMultiThreading. g. ... ... 2323Module 3: Thực hành về
Module 3: Thực hành về
Collections.
Collections.
... ... 3434Module 4: Thực hành về
Module 4: Thực hành về
Networking.
Networking.
... ... .. 4646 Module 5: TModule 5: T
hực hành về JDBC.
hực hành về JDBC.
... ... 6464Module 6: Thực hành về JSP.
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
Mục lục
Mục lục
Module 1 :
Module 1 :
Ôn tập Graphic User Interface
Ôn tập Graphic User Interface
. ... ... ... 33Module 2: Thực hành về
Module 2: Thực hành về
MultiThreadinMultiThreading. g. ... ... 2323Module 3: Thực hành về
Module 3: Thực hành về
Collections.
Collections.
... ... 3434Module 4: Thực hành về
Module 4: Thực hành về
Networking.
Networking.
... ... .. 4646 Module 5: TModule 5: T
hực hành về JDBC.
hực hành về JDBC.
... ... 6464Module 6: Thực hành về JSP.
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica Trang 3 Trang 3
MODULE
MODULE 1
1
Mục đích:
Mục đích:
Ôn tập Graphic User Interface
Ôn tập Graphic User Interface,, giúp các sinh viên hiểu được LayoutManager, Common Control,giúp các sinh viên hiểu được LayoutManager, Common Control, Event, DialogBox, Advanced Control.
Event, DialogBox, Advanced Control. Sinh viên phải thực hiện tốt Module 1 để ứng dụng choSinh viên phải thực hiện tốt Module 1 để ứng dụng cho các Module tiếp theo, đặc biệt là phần kết nối cơ sở dữ liệu.
các Module tiếp theo, đặc biệt là phần kết nối cơ sở dữ liệu.
Bài tập 1:
Bài tập 1: Thực hành cách hiển thị cửa sổ Windows trong JavaThực hành cách hiển thị cửa sổ Windows trong Java
Hãy hiển thị cửa sổ trên, yêu cầu viết class kế thừa từ JFrame Hãy hiển thị cửa sổ trên, yêu cầu viết class kế thừa từ JFrame Hướn
Hướnggdẫn:dẫn:
Giải thích: Giải thích:
Tổ hợp công nghệ giáo dục Topica Bài tập 2: Thực hành về FlowLayout
FlowLayout cho phép add các control trên cùng một dòng, khi nào hết chỗ chứa nó sẽ tự động xuống dòng, ta cũng có thể điều chỉnh hướng xuất hiện của control. Mặc định khi một JPanel được khởi tạo thì bản thân lớp chứa này sẽ có kiểu Layout là FlowLayout.
Hướng dẫn:
Bài tập 3: Thực hành về BoxLayout
BoxLayout cho phép add các control theo dòng hoặc cột, tại mỗi vị trí add nó chỉ chấp nhận 1 control, do đó muốn xuất hiện nhiều control tại một vị trí thì bạn nên add vị trí đó là 1 JPanel rồi sau đó add các control khác vào JPanel này.
Tổ hợp công nghệ giáo dục Topica
Trang 5
BoxLayout.X_AXIS : Cho phép add các control theo hướng từ trái qua phải . BoxLayout.Y_AXIS : Cho phép add các control theo hướng từ trên xuống dưới.
BoxLayout sẽ không tự động xuống dòng khi hết chỗ chứa, tức là các control sẽ bị che khuất
nếu như thiếu không gian chứa nó.
Tổ hợp công nghệ giáo dục Topica Bài tập 4: Thực hành về BorderLayout
BorderLayout giúp chúng ta hiển thị các control theo 5 vùng : North, South, West, East, Center
Nếu như không có 4 vùng : North, West, South, East. Thì vùng Center sẽ tràn đầy cửa sổ, thông thường khi đưa các control JTable, JTree, ListView, JScrollpane… ta thường đưa vào vùng Center để nó có thể tự co giãn theo kích thước cửa sổ giúp giao diện đẹp hơn.
Tổ hợp công nghệ giáo dục Topica Trang 7 Bài tập 5: Thực hành về các control căn bản JButton JLabel JTextField JTextArea
ButtonGroup & JRadioButton JCheckBox
JComboBox JList
Thiết kế giao diện để giải phương trình bậc 2:
Hướng dẫn: Sinh viên phải xác định Layout Manager trước, ta cũng có thể kế hợp các Layout để thiết kế giao diện, đặt tên control theo yêu cầu bên dưới
Tên Control Tên Biến Control Mô tả
JTextField txtSoa Dùng để nhập giá trị cho a
JTextField txtSob Dùng để nhập giá trị cho b
JTextField txtSoc Dùng để nhập giá trị cho c
JTextField txtKetqua Dùng để hiển thị kết quả
JButton btnGiai Viết lệnh để giải phương trình
JButton btnXoaTrang Xóa toàn bộ dữ liệu trong ô dl
JButton btnThoat Viết lệnh thoát chương trình
Tổ hợp công nghệ giáo dục Topica
Bài tập 6: thiết kế giao diện để thực hiện các phép toán :
‘+’ ‘
-’ ‘*’ ‘:’
Thiết kế giao diện như hình bên dưới:
Khi bấm nút Giải thì tùy thuộc vào phép toán được chọn mà kết quả thực hiện khác nhau . import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class CongTruNhanChiaUI extends JFrame {
private static final long serialVersionUID = 1L;
public CongTruNhanChiaUI(String title) {
setTitle(title); }
public void doShow() { setSize(400, 300); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setResizable(false); setVisible(true); }
public void addControl() {
JPanel pnBorder=new JPanel();
pnBorder.setLayout(new BorderLayout()); JPanel pnNorth=new JPanel();
JLabel lblTitle=new JLabel("Cộng Tr ừ Nhân Chia"); pnNorth.add(lblTitle);
Tổ hợp công nghệ giáo dục Topica
Trang 9 lblTitle.setFont(ft);
JPanel pnWest=new JPanel();
pnWest.setLayout(new BoxLayout(pnWest, BoxLayout.Y_AXIS));
JButton btnGiai=new JButton("Giải "); JButton btnXoa=new JButton("Xóa "); JButton btnThoat=new JButton("Thoát"); pnWest.add(btnGiai); pnWest.add(Box.createVerticalStrut(10)); pnWest.add(btnXoa); pnWest.add(Box.createVerticalStrut(10)); pnWest.add(btnThoat); pnBorder.add(pnWest,BorderLayout.WEST ); pnWest.setBackground(Color.LIGHT_GRAY ); Border southborder
=BorderFactory.createLineBorder(Color.RED);
TitledBorder southTitleBorder=
new TitledBorder(southborder, "Chọn tác vụ"); pnWest.setBorder(southTitleBorder);
JPanel pnSouth=new JPanel();
pnSouth.setPreferredSize(new Dimension(0, 30)); pnSouth.setBackground(Color.PINK );
JPanel pns1=new JPanel();
pns1.setBackground(Color.BLUE); pnSouth.add(pns1);
JPanel pns2=new JPanel();
pns2.setBackground(Color.RED);
pnSouth.add(pns2);
JPanel pns3=new JPanel();
pns3.setBackground(Color.YELLOW ); pnSouth.add(pns3);
pnBorder.add(pnSouth,BorderLayout.SOUTH );
JPanel pnCenter=new JPanel();
pnCenter.setLayout(new BoxLayout(pnCenter, BoxLayout.Y_AXIS)); pnBorder.add(pnCenter,BorderLayout.CENTER);
Border centerborder
=BorderFactory.createLineBorder(Color.RED); TitledBorder centerTitleBorder=
new TitledBorder(centerborder, "nhập 2 số a và b:"); pnCenter.setBorder(centerTitleBorder);
JPanel pna=new JPanel();
JLabel lbla=new JLabel("nhập a:");
final JTextField txta=new JTextField(15); pna.add(lbla);
Tổ hợp công nghệ giáo dục Topica pnCenter.add(pna);
JPanel pnb=new JPanel();
JLabel lblb=new JLabel("nhập b:");
final JTextField txtb=new JTextField(15); pnb.add(lblb);
pnb.add(txtb); pnCenter.add(pnb);
JPanel pnc=new JPanel();
JPanel pnpheptoan=new JPanel();
pnpheptoan.setLayout(new GridLayout(2, 2)); pnpheptoan.setBorder(new
TitledBorder(BorderFactory.createLineBorder(Color.BLACK ),"Chọn phép
toán:"));
final JRadioButton radCong=new JRadioButton("Cộng"); pnpheptoan.add(radCong);
final JRadioButton radTru=new JRadioButton("Tr ừ "); pnpheptoan.add(radTru);
final JRadioButton radNhan=new JRadioButton("Nhân"); pnpheptoan.add(radNhan);
final JRadioButton radChia=new JRadioButton("Chia"); pnpheptoan.add(radChia);
ButtonGroup group=new ButtonGroup(); group.add(radCong);group.add(radTru); group.add(radNhan);group.add(radChia); pnc.add(pnpheptoan);
pnCenter.add(pnc);
JPanel pnkq=new JPanel();
JLabel lblkq=new JLabel("Kết quả:");
final JTextField txtkq=new JTextField(15); pnkq.add(lblkq);
pnkq.add(txtkq); pnCenter.add(pnkq);
lbla.setPreferredSize(lblkq.getPreferredSize()); lblb.setPreferredSize(lblkq.getPreferredSize()); btnThoat.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int ret=JOptionPane.showConfirmDialog(null, "Muốn thoát hả?", "Thoát", JOptionPane.YES_NO_OPTION );
if(ret==JOptionPane.YES_OPTION )
System.exit(0);
} });
Tổ hợp công nghệ giáo dục Topica Trang 11 txta.setText(""); txtb.setText(""); txtkq.setText(""); txta.requestFocus(); } });
btnGiai.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { String sa=txta.getText();
int a=0,b=0;
try
{
a=Integer. parseInt(sa);
}
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Nhập sai
định dạng!"); txta.selectAll(); txta.requestFocus(); return; } String sb=txtb.getText(); try { b=Integer. parseInt(sb); }
catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Nhập sai định dạng!"); txtb.selectAll(); txtb.requestFocus(); return; } double kq=0; if(radCong.isSelected()) { kq=(a+b); } else if(radTru.isSelected()) { kq=(a-b); } else if(radNhan.isSelected()) { kq=(a*b); } else
Tổ hợp công nghệ giáo dục Topica { kq=a*1.0/b*1.0; } txtkq.setText(kq+""); } }); Container con=getContentPane(); con.add(pnBorder); }
public static void main(String[] args) {
CongTruNhanChiaUI ui=new CongTruNhanChiaUI("Cộng - Tr ừ Nhân -Chia");
ui.doShow(); }
}
Bài tập 7: Thao tác trên JList – Jcheckbox
Thiết kế giao diện như hình bên dưới và thực hiện các thao tác theo yêu cầu:
- Chương trình cho phép nhậ p vào các số nguyên từ giao diện trong phần nhậ p thông tin, Khi ngườ i sử nhậ p giá tr ị vào JTextField và click nút “Nhập” thì sẽ cậ p nhậ p dữ liệu xuống JList, Nếu checked vào “Cho nhậ p số âm” thì các số âm mới được phép đưa vào JList còn không thì thông báo lỗi.
- Ô Chọn tác vụ, sinh viên phải thực hiện toàn bộ các yêu cầu
- Nút Đóng chương trình: sẽ hiển thị thông báo hỏi ngườ i sử dụng có muốn đóng hay không.
Tổ hợp công nghệ giáo dục Topica
Trang 13 Bài tập 8: Viết chương trình quản lý sản phẩm
Yêu cầu chức năng: Cho phép nhập/ xuất danh mục, danh sách sản phẩm - Cho phép cậ p nhật thông tin
- Cho phép lưu / đọc danh mục sản phẩm
- Yêu cầu sử dụng JMenuBar, JList, JTable, JCombobox, …
Cách lưu/ đọc đối tượng trên ổ cứng:
- Tất cả các class phải implements Serializable:
o public class Sanpham implementsSerializable{…}
o public class DanhMucSanPham implementsSerializable{…}
- Viết một class MyFile có 2 phương thức: o Lưu đối tượ ng:
public static void luuDoiTuong(Object obj, String fileName) {
try {
FileOutputStream fOut=new FileOutputStream(fileName); MenuWrite Data to disk dùng để lưu dữ liệu xuống ổ cứng
MenuOpen Data from disk để đọc dữ liệ từ ổ cứng
Tổ hợp công nghệ giáo dục Topica ObjectOutputStream out=new ObjectOutputStream(fOut); out.writeObject(obj); out.close(); } catch(Exception ex) { ex.printStackTrace(); } } o Đọc đối tượ ng
public static Object docDoiTuong(String fileName) {
try {
FileInputStream fIn=new FileInputStream(fileName); ObjectInputStream in=new ObjectInputStream(fIn); Object o=in.readObject(); in.close(); return o; } catch(Exception ex) { ex.printStackTrace(); } return null; } - Trong testMain:
DanhMucSanPham dsDienTu=(DanhMucSanPham )MyFile.docDoiTuong ("luuluu.data"); if(dsDienTu!=null)
System.out.println(dsDienTu);
MyFile.luuDoiTuong (dsDienTu, "luuluu.data");
Bài tập 9: Thực hành về Timer class (*)
Dùng class Timer để thiết kế ứng dụng ImageAnimation.
Giao diện sẽ có 2 JButton: Start và Stop. Khi bấm Start chương trình sẽ hiển thị hình ảnh tuần tự trong mảng 10 hình ảnh có sẵn. Bấm Stop để tạm dừng duyệt hình ảnh. Xem hình yêu cầu
Tổ hợp công nghệ giáo dục Topica Trang 15 Hướng dẫn: Dùng CardLayout và Timer import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class ImageAnimation extends JFrame{
private static final long serialVersionUID = 1L; Timer timer;
private int pos=1;
public ImageAnimation(String title) { super(title); timer=new Timer(500, null); } public void doShow() { setSize(500,550); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setVisible(true); } public void addControl() { JPanel pnBorder=new JPanel(); pnBorder.setLayout(new BorderLayout()); JPanel pnNorth=new JPanel(); JButton btnStart=new JButton("Start"); JButton btnStop=new JButton("Stop"); pnNorth.add(btnStart); pnNorth.add(btnStop); pnBorder.add(pnNorth,BorderLayout.NORTH ); final JPanel pnCenter=new JPanel();
Tổ hợp công nghệ giáo dục Topica pnCenter.setLayout(new CardLayout()); pnBorder.add(pnCenter,BorderLayout.CENTER); pnCenter.setBackground(Color.RED); JPanel []pnArr=new JPanel[10]; addImage(pnCenter,pnArr); showImage(pnCenter,"card1"); btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
timer.start();
timer.addActionListener(new TimerPanel(pnCenter)); }
});
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { timer.stop(); } }); Container con=getContentPane(); con.add(pnBorder); }
private void addImage(JPanel pnCenter,JPanel []pnArr) { for(int i=0;i<pnArr.length;i++) { pnArr[i]=new JPanel(); JLabel lbl=new JLabel(); ImageIcon icon=new ImageIcon("E:\\hoa\\"+i+".jpg"); lbl.setIcon(icon); pnArr[i].add(lbl); pnCenter.add(pnArr[i],"card"+i); } }
public void showImage(JPanel pn,String cardName) {
CardLayout cl=(CardLayout)pn.getLayout(); cl.show(pn, cardName);
}
private class TimerPanel implements ActionListener {
JPanel pn=null;
public TimerPanel(JPanel pn) { this.pn=pn;
}
public void actionPerformed(ActionEvent arg0) { showImage(pn,"card"+pos); pos++; if(pos>=10) pos=1; } }
public static void main(String[] args) {;
Tổ hợp công nghệ giáo dục Topica
Trang 17
}
Bài tập 10: Cải tiến bài tập 10. Chương trình sẽ cho phép đọc danh sách các hình ảnh bất kỳ
trong ổ đĩa. (*) Hướng dẫn: import java.awt.*; import java.awt.event.*; import java.io.File; import javax.swing.*;
public class ImageAnimation2 extends JFrame{
private static final long serialVersionUID = 1L; Timer timer;
private int pos=0;
public ImageAnimation2(String title) { super(title); timer=new Timer(500, null); } public void doShow() { setSize(500,550); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); addControl(); setVisible(true); } public void addControl() { JPanel pnBorder=new JPanel(); pnBorder.setLayout(new BorderLayout());
Tổ hợp công nghệ giáo dục Topica JPanel pnNorth=new JPanel(); JButton btnBrowser=new JButton("Browser"); JButton btnStart=new JButton("Start"); JButton btnStop=new JButton("Stop"); pnNorth.add(btnBrowser); pnNorth.add(btnStart); pnNorth.add(btnStop); pnBorder.add(pnNorth,BorderLayout.NORTH ); final JPanel pnCenter=new JPanel(); pnCenter.setLayout(new CardLayout()); pnBorder.add(pnCenter,BorderLayout.CENTER); pnCenter.setBackground(Color.RED); btnStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
timer.start();
timer.addActionListener(new TimerPanel(pnCenter)); }
});
btnStop.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { timer.stop();
} });
btnBrowser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
JFileChooser jfc=new JFileChooser(); jfc.setMultiSelectionEnabled(true); if(jfc.showOpenDialog(null)==JFileChooser. APPROVE_OPTION ) { File []files=jfc.getSelectedFiles(); for(int i=0;i< files.length;i++) { File f=files[i];
ImageIcon icon=new ImageIcon(f.getPath()); JPanel pn=new JPanel();
JLabel lbl=new JLabel(icon); pn.add(lbl); pnCenter.add(pn,"card"+i); } showImage(pnCenter, "card0"); } } }); Container con=getContentPane(); con.add(pnBorder); }
public void showImage(JPanel pn,String cardName) {
Tổ hợp công nghệ giáo dục Topica
Trang 19
}
private class TimerPanel implements ActionListener {
JPanel pn=null;
public TimerPanel(JPanel pn) { this.pn=pn;
}
public void actionPerformed(ActionEvent arg0) { showImage(pn,"card"+pos); pos++; if(pos>=pn.getComponentCount()) pos=0; } }
public static void main(String[] args) {;
ImageAnimation2 imgUi=new ImageAnimation2("Image Animation!"); imgUi.doShow();
} }
Bài tập 11: Thực hành về tạo Menu. Yêu cầu thiết kế Menu theo hình sau, ứng với mỗi menu
item sinh viên hãy cài đặt coding để hiển thị thông báo là đang chọn menu nào. (*) Hướng dẫn: JMenuBar JMenuJMenuItem. Phải biết kết hợp các class này.
MenuBar sẽ add Menu, Menu sẽ add MenuItem, rồi gọi setJMenuBar(menuBar); Yêu cầu giả lập Menu giống như chương trình Foxit Reader :
Tổ hợp công nghệ giáo dục Topica
Menu Edit có giao diện như trên
Bài tập 12: Thực hành về JToolBar, tương tự như câu 12, giả lập Toolbar của chương trình
Foxit Reader , ứng với mỗi lệnh trên JToolBar, sinh viên hãy xuấtt thông báo đang sử dụng chức năng nào. (*)
Hướng dẫn: tạo các JButton rồi add vào JToolBar
Bài tập 13: Thiết kế giao diện như hình bên dưới - JTable: (*)
package baitap13;
Tổ hợp công nghệ giáo dục Topica Trang 21 import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class AccUI { JFrame myFrame=new JFrame("Account"); JTextField txtAccNumber; JTextField txtAccName; JTextField txtAccMoney; JTable tblAcc; DefaultTableModel tblModelAcc; JButton btnAdd,btnClear,btnExit; public AccUI() { JPanel pnAccNumber=new JPanel();
pnAccNumber.setLayout(new BoxLayout(pnAccNumber, BoxLayout.X_AXIS )); JLabel lblAccNumber=new JLabel("Account Number:");
pnAccNumber.add(lblAccNumber); txtAccNumber=new JTextField(15); pnAccNumber.add(txtAccNumber);
JPanel pnAccName=new JPanel();
pnAccName.setLayout(new BoxLayout(pnAccName, BoxLayout.X_AXIS )); JLabel lblAccName=new JLabel("Account Name:");
pnAccName.add(lblAccName); txtAccName=new JTextField(15); pnAccName.add(txtAccName);
JPanel pnAccMoney=new JPanel();
pnAccMoney.setLayout(new BoxLayout(pnAccMoney, BoxLayout.X_AXIS )); JLabel lblAccMoney=new JLabel("Account Money:");
pnAccMoney.add(lblAccMoney); txtAccMoney=new JTextField(15); pnAccMoney.add(txtAccMoney); Container con=myFrame.getContentPane(); con.setLayout(new BorderLayout()); JPanel pInfor=new JPanel();
pInfor.setLayout(new BoxLayout(pInfor, BoxLayout.Y_AXIS )); pInfor.add(pnAccNumber); pInfor.add(pnAccName); pInfor.add(pnAccMoney); con.add(pInfor,BorderLayout.NORTH ); tblModelAcc=new DefaultTableModel(); tblModelAcc.addColumn("Acc Number"); tblModelAcc.addColumn("Acc Name"); tblModelAcc.addColumn("Acc Money"); tblAcc=new JTable(tblModelAcc); JScrollPane sc=new
JScrollPane(tblAcc,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS ,JScrollPane.HORIZONTAL_SCR OLLBAR_AS_NEEDED );
Tổ hợp công nghệ giáo dục Topica JPanel pnButton=new JPanel(); btnAdd=new JButton("Add"); btnAdd.setMnemonic('A'); btnClear=new JButton("Clear"); btnClear.setMnemonic('C'); btnExit=new JButton("Exit"); btnExit.setMnemonic('E'); pnButton.add(btnAdd); pnButton.add(btnClear); pnButton.add(btnExit); con.add(pnButton,BorderLayout.SOUTH ); lblAccName.setPreferredSize(lblAccNumber.getPreferredSize()); lblAccMoney.setPreferredSize(lblAccNumber.getPreferredSize()); addEvents(); } public void addEvents() { btnAdd.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub
String arr[]={txtAccNumber.getText(),txtAccName.getText(),txtAccMoney.getText()}; tblModelAcc.addRow(arr); } }); btnExit.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub
int ret=JOptionPane.showConfirmDialog (null, "Are you sure you want to exit?", "Exit!", JOptionPane.YES_NO_OPTION );
if(ret==JOptionPane.YES_OPTION ) System.exit(0); } }); } public void doShow() { myFrame.setSize(400, 300); myFrame.setLocationRelativeTo(null); myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); myFrame.setVisible(true); } } package baitap13; public class TestAccount { /** * @param args */
public static void main(String[] args) { AccUI ui=new AccUI();
ui.doShow(); }
Tổ hợp công nghệ giáo dục Topica
Trang 23
MODULE 2
Mục đích:
Thực hành MultiThreading, hiểu được Thread, Runnable, Swings với Threading Bài tập 1: Tạo một Thread kế thừa từ Thread class
Tổ hợp công nghệ giáo dục Topica
Bài tập 3: Hiển thị các trạng thái trong Thread
Bài tập 4: Kiểm tra currentThread, acctiveCount và isAlive
Bài tập 5: Thiết lập độ ưu tiên cho Thread (dùng phương thức setPriority), có 3 độ ưu tiên căn bản : MAX_PRIORITY (10), NORM_PRIORITY(5), MIN_PRIORITY(1). Chúng ta có thể
Tổ hợp công nghệ giáo dục Topica
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica Bài tập 6:
Bài tập 6: Thực hành về Deamon ThreadThực hành về Deamon Thread
Bài tập 7:
Bài tập 7: Hãy viết chương trình Demo chuyển khoản ngân hàngHãy viết chương trình Demo chuyển khoản ngân hàng Yêu cầu :
Yêu cầu : PPhải đồng bộ dữ liệu giữa các lần gửi tiền / Rút tiềnhải đồng bộ dữ liệu giữa các lần gửi tiền / Rút tiền Mục đích : Hiểu được
Mục đích : Hiểu được Race Condition,Race Condition, ReentrantLock , synchronizedReentrantLock , synchronized…… Ví
Ví dụ về Race Conditiondụ về Race Condition.. Class
Class Bank Bank
/**
/**
A bank with a number of bank accounts.
A bank with a number of bank accounts.
*/
*/
public
public classclass Bank { Bank { /**
/**
Constructs the bank.
Constructs the bank.
@param
@param n the number of accounts n the number of accounts
@param
@param initialBalance the initial balance initialBalance the initial balance
for each account
for each account
*/
*/
public
public Bank( Bank(intint n, n, doubledouble initialBalance)initialBalance) {
{
accounts
accounts = = newnew doubledouble[n];[n];
for
for ( (intint i = 0; i < i = 0; i < accountsaccounts..lengthlength; i++); i++) accounts
accounts[i] = [i] = initialBalance;initialBalance; }
} /**
/**
Transfers money from one account to another.
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
Trang 27 Trang 27
@param
@param amount the amount to amount the amount to transfertransfer
*/
*/
public
public voidvoid transfer( transfer(intint from, from, intint to, to, doubledouble amount) amount) {
{
if
if ( (accountsaccounts[from] < amount)[from] < amount) returnreturn;; System.
System.outout.print(Thread..print(Thread.currentThread currentThread ());()); accounts
accounts[from] -= amount;[from] -= amount; System.
System.outout.printf(.printf(" %10.2f from %d to %d"" %10.2f from %d to %d", amount, from, to);, amount, from, to); accounts
accounts[to] += amount;[to] += amount; System.
System.outout.printf(.printf(" Total Balance: %10.2f%n"" Total Balance: %10.2f%n", , getTotalBalancgetTotalBalance());e()); }
} /**
/**
Gets the sum of
Gets the sum of all account balances.all account balances.
@return
@return the total balance the total balance
*/
*/
public
public doubledouble getTotalBalancegetTotalBalance()() {
{
double
double sum = 0; sum = 0;
for
for ( (doubledouble a : a : accountsaccounts)) sum += a;
sum += a;
return
return sum; sum; }
} /**
/**
Gets the number of accounts in the bank.
Gets the number of accounts in the bank.
@return
@return the number of accounts the number of accounts
*/
*/
public
public intint size() size() {
{
return
return accountsaccounts..lengthlength;; }
}
private
private finalfinal doubledouble[][] accountsaccounts;; }
}
Class
Class TransferRunnableTransferRunnable
/**
/**
A runnable that transfers money from an
A runnable that transfers money from an account to otheraccount to other
accounts in a bank.
accounts in a bank.
*/
*/
public
public classclass TransferRunnabTransferRunnablele implementsimplements Runnable { Runnable { /**
/**
Constructs a transfer runnable.
Constructs a transfer runnable.
@param
@param b the b the bank between whose account money is transferredbank between whose account money is transferred
@param
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
@param
@param max the maximum amount of money in each transfer max the maximum amount of money in each transfer
*/
*/
public
public TransferRunnable(Bank b, TransferRunnable(Bank b, intint from, from, doubledouble max) max) {
{
bank
bank = b; = b; fromAccount
fromAccount = from; = from; maxAmount
maxAmount = max; = max; }
}
public
public voidvoid run() run() { { try try { { while
while ( (truetrue)) {
{
int
int toAccount = ( toAccount = (intint) () (bankbank.size() * Math..size() * Math.randomrandom());());
double
double amount = amount = maxAmountmaxAmount * Math. * Math.randomrandom();(); bank
bank.transfer(fromAccount.transfer(fromAccount, toAccount, amount);, toAccount, amount); Thread.
Thread.sleepsleep((((intint) () (DELAYDELAY * Math. * Math.randomrandom()));()));
} } }
}
catch
catch (InterruptedException e) {} (InterruptedException e) {} }
}
private
private Bank Bank bankbank;;
private
private intint fromAccountfromAccount;;
private
private doubledouble maxAmountmaxAmount;;
private
private intint DELAYDELAY = 10; = 10; }
}
Class
Class UnsynchBankTestUnsynchBankTest public
public classclass UnsynchBankTesUnsynchBankTestt {
{
public
public staticstatic voidvoid main(String[] args) main(String[] args) {
{
Bank b =
Bank b = newnew Bank( Bank(NACCOUNTSNACCOUNTS,, INITIAL_BALANCEINITIAL_BALANCE););
int
int i; i;
for
for (i = 0; i < (i = 0; i < NACCOUNTSNACCOUNTS; i++); i++) {
{
TransferRunnabl
TransferRunnable r e r == newnew TransferRunnable(b, i, TransferRunnable(b, i, INITIAL_BALANCEINITIAL_BALANCE);); Thread t =
Thread t = newnew Thread(r); Thread(r); t.start(); t.start(); } } } } public
public staticstatic finalfinal intint NACCOUNTSNACCOUNTS = 100; = 100;
public
Tổ hợp công nghệ giáo dục Topica
Trang 29 Kết quả ta thấy dữ liệu không được đồng bộ, cho du chuyển / nhận sảy ra thì tổng tiền cũng phải giữ nguyên, ở đây nó bị thay đổi, nguyên nhân gây ra là do Race Condition
Chúng ta sửa lại hàm run :
Tổ hợp công nghệ giáo dục Topica
Chúng ta có thể đồng bộ bằng cách tiếp cận ReentrantLock . Dưới đây là code minh họa:
Class Bank
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
A bank with a number of bank accounts. */
public class Bank { /**
Constructs the bank.
@param n the number of accounts
@param initialBalance the initial balance for each account
*/
public Bank(int n, double initialBalance) {
accounts = new double[n];
for (int i = 0; i < accounts.length; i++) accounts[i] = initialBalance;
bankLock = new ReentrantLock();
sufficientFunds = bankLock.newCondition(); }
/**
Transfers money from one account to another.
@param from the account to transfer from
@param to the account to transfer to
@param amount the amount to transfer */
public void transfer(int from, int to, double amount)
throws InterruptedException {
bankLock.lock();
try
{
while (accounts[from] < amount) sufficientFunds.await();
System.out.print(Thread.currentThread ()); accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d", amount, from, to); accounts[to] += amount;
System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); sufficientFunds.signalAll(); } finally { bankLock.unlock(); } } /**
Gets the sum of all account balances.
Tổ hợp công nghệ giáo dục Topica Trang 31 bankLock.lock(); try { double sum = 0;
for (double a : accounts) sum += a; return sum; } finally { bankLock.unlock(); } } /**
Gets the number of accounts in the bank.
@return the number of accounts */
public int size() {
return accounts.length; }
private final double[] accounts;
private Lock bankLock;
private Condition sufficientFunds; }
Class TransferRunnable
/**
A runnable that transfers money from an account to other accounts in a bank.
*/
public class TransferRunnable implements Runnable { /**
Constructs a transfer runnable.
@param b the bank between whose account money is transferred
@param from the account to transfer money from
@param max the maximum amount of money in each transfer */
public TransferRunnable(Bank b, int from, double max) {
bank = b;
fromAccount = from; maxAmount = max; }
public void run() {
try
{
while (true) {
Tổ hợp công nghệ giáo dục Topica
int toAccount = (int) (bank.size() * Math.random());
double amount = maxAmount * Math.random(); bank.transfer(fromAccount, toAccount, amount); Thread.sleep((int) (DELAY * Math.random())); }
}
catch (InterruptedException e) {} }
private Bank bank;
private int fromAccount;
private double maxAmount;
private int DELAY = 10; }
Class SynchBankTest
/**
This program shows how multiple threads can safely access a data structure. */
public class SynchBankTest {
public static void main(String[] args) {
Bank b = new Bank(NACCOUNTS, INITIAL_BALANCE);
int i;
for (i = 0; i < NACCOUNTS; i++) {
TransferRunnable r = new TransferRunnable(b, i, INITIAL_BALANCE); Thread t = new Thread(r);
t.start(); }
}
public static final int NACCOUNTS = 100;
public static final double INITIAL_BALANCE = 1000; }
Bài tập 8 : Tiếp tục với bài chuyển khoản ở câu 7, yêu cầu thiết kế giao diện như hình dưới đây để thực hiện chức năng chuyển khoản. Bấm vào Start chương trình sẽ tiến hành chuyển khoản trên giao diện, khi bấm Stop chương trình sẽ dừng chuyển khoản.
Tổ hợp công nghệ giáo dục Topica
Trang 33 Bài tập 9: Dùng đa tiến trình để cập nhập dữ liệu cho JProgressBar. Giao diện chương trình như bên dưới. Coding mẫu : import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.Border;
class myRun implements Runnable {
JProgressBar proBar=null;
public myRun(JProgressBar bar) {
proBar=bar; }
public void run() {
int x=0;
while(x<=100) {
proBar.setValue(x); x++;
try {Thread.sleep(1000);}
catch (InterruptedException e) {} }
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null, "Done"); }
}
public class ProgressSample {
public static void main(String args[]) {
JFrame f = new JFrame("JProgressBar Sample"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container content = f.getContentPane();
final JProgressBar progressBar = new JProgressBar(); progressBar.setStringPainted(true);
Border border = BorderFactory.createTitledBorder("Reading..."); progressBar.setBorder(border);
content.add(progressBar, BorderLayout.NORTH ); JButton btn=new JButton("Start");
JPanel pn=new JPanel();
content.add(pn, BorderLayout.SOUTH ); pn.add(btn);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { Thread t1=new Thread(new myRun(progressBar)); t1.start(); } }); f.setSize(300, 120); f.setLocationRelativeTo(null); f.setVisible(true); } }
Tổ hợp công nghệ giáo dục Topica
Bài tập 10: Dùng đa tiến trình để minh họa các thuật toán sắp xếp như giao diện bên dưới: (*)
Code mẫu xem trên trang : http://tranduythanh.blog.com/2012/07/31/vi-du-da-tien-trinh-trong-java-thuat-toan-sap-xep/
MODULE 3
Mục đích:
Thực hành về Collections, giúp sinh viên hiểu được : ArrayList, LinkedList, Vector, Hash table, HashSet, LinkedHashSet, TreeSet, HashMap, TreeMap, PriorityQueue, Properties.
Bài tập 1 : Viết chương trình quản lý sinh viên dưới dạng console, yêu cầu sử dụng ArrayList
hoặc LinkedList hoặc Vector và thực hiện các chức năng sau (thông tin sinh viên bao gồm : mã
số sinh viên, họ tên, năm sinh, địa chỉ, lớp học): a) Cho phép thêm, sửa, xóa danh sách sinh viên b) Xuất ra số lượ ng sinh viên
c) Xuất ra danh sách các sinh viên thuộc một lớ p học bất k ỳ nhậ p vào từ bàn phím d) Cho phép lưu/mở danh sách sinh viên trên ổ cứng
Tổ hợp công nghệ giáo dục Topica
Trang 35
package chap2.quanlysinhvien;
import java.util.Date;
public class Sinhvien {
private String Masv;
private String Tensv;
private Date Namsinh;
private String Diachi;
private String Lop;
public String getMasv() {
return Masv; }
public void setMasv(String masv) { Masv = masv;
}
public String getTensv() {
return Tensv; }
public void setTensv(String tensv) { Tensv = tensv;
}
public Date getNamsinh() {
return Namsinh; }
public void setNamsinh(Date namsinh) { Namsinh = namsinh;
}
public String getDiachi() {
return Diachi; }
public void setDiachi(String diachi) { Diachi = diachi;
}
public String getLop() {
return Lop; }
public void setLop(String lop) { Lop = lop;
}
public String toString() {
return "Sinhvien [Masv=" + Masv + ", Tensv=" + Tensv + ", Namsinh=" + Namsinh + ", Diachi=" + Diachi + ", Lop=" + Lop + "]"; }
}
Class DanhSachSinhvien
package chap2.quanlysinhvien;
import java.util.ArrayList;
public class DanhSachSinhvien {
private ArrayList<Sinhvien> dsSv=new ArrayList<Sinhvien>();
public boolean ktTrungma(String masv) { for(Sinhvien sv : dsSv) { if(sv.getMasv().equalsIgnoreCase(masv)) return true; } return false; }
Tổ hợp công nghệ giáo dục Topica
public boolean addSinhvien(Sinhvien sv) {
if(ktTrungma(sv.getMasv()))
return false;
return dsSv.add(sv); }
public Sinhvien findSinhvien1(String masv) { for(Sinhvien sv : dsSv) { if(sv.getMasv().equalsIgnoreCase(masv)) return sv; } return null; }
public int findSinhvien2(String masv) {
for(int i=0;i<dsSv.size();i++) { if(dsSv.get(i).getMasv().equalsIgnoreCase(masv)) return i; } return -1; }
public Sinhvien updateSinhvien(int index,Sinhvien sv) {
return dsSv.set(index, sv); }
public void removeSinhvien(String masv) { Sinhvien sv=findSinhvien1(masv); dsSv.remove(sv); //int pos=findSinhvien2(masv); //dsSv.remove(pos); }
public String toString() {
return dsSv.toString(); }
}
Class TestSinhvien
package chap2.quanlysinhvien;
public class TestSinhvien {
public static void main(String[] args) {
DanhSachSinhvien qlsv=new DanhSachSinhvien(); Sinhvien teo=new Sinhvien();
teo.setMasv("113");
teo.setTensv("Nguyễn Văn Tèo"); qlsv.addSinhvien(teo);
Sinhvien ty=new Sinhvien(); ty.setMasv("114");
ty.setTensv("Nguyễn Thị tý"); qlsv.addSinhvien(ty);
System.out.println(qlsv); }
Tổ hợp công nghệ giáo dục Topica
Trang 37
Bài tập 2: Thêm chức năng sắp xếp danh sách sinh viên theo mã số ở bài tập 1.
Bài tập này giúp sinh viên hiểu được chức năng sort của Collections và interface Comparable
Để sắp xếp được các sinh viên theo mã số thì class Sinh viên phải implements interface Comparable đồng thời chúng ta phải override phương thức compareTo.
Coding mẫu cho bài này như sau:
package chap2.quanlysinhvien;
import java.util.Date;
public class Sinhvien implements Comparable<Sinhvien>{
private String Masv;
…//code here…
public String getMasv() {
return Masv; }
public int compareTo(Sinhvien o) {
if(Masv.equalsIgnoreCase(o.getMasv())) return 0; return 1; } } package chap2.quanlysinhvien; import java.util.ArrayList; import java.util.Collections;
public class DanhSachSinhvien {
private ArrayList<Sinhvien> dsSv=new ArrayList<Sinhvien>();
…//code here…
public void sort() {
Collections.sort(dsSv); }
}
Khi nào muốn sắp xếp danh sách chúng ta chỉ cần gọi hàm sort trong class trên.
public class TestSinhvien {
public static void main(String[] args) {
DanhSachSinhvien qlsv=new DanhSachSinhvien(); Sinhvien teo=new Sinhvien();
teo.setMasv("113");
teo.setTensv("Nguyễn Văn Tèo"); qlsv.addSinhvien(teo);
Sinhvien ty=new Sinhvien(); ty.setMasv("114");
ty.setTensv("Nguyễn Thị tý"); qlsv.addSinhvien(ty);
qlsv.sort();
System.out.println(qlsv); }
Tổ hợp công nghệ giáo dục Topica
Bài tập 3: Hiệu chỉnh bài tập 1 về dạng Graphic User Interface, giao diện như bên dưới:
Yêu cầu:
- Sử dụngSimpleDateFormatđể định dạng nhập năm sinh.
- NútThêm cho phép xóa tr ắng dữ liệu ở mục thông tin chi tiết và cho phép nhậ p dữ liệu mớ i vào, khi nhấ p nút Lưu sẽ lưu thông tin xuống ArrayList đồng thờ i cậ p nhậ p JTable. - Nút Lưu dùng để lưu sinh viên vào danh sách ArrayList, nếu mã tồn tại thì tự động gọi
hàm cậ p nhậ p thông tin.
- Nútxóa cho phép xóa sinh viên đang chọn trong JTable.
- Mỗi lần click vào từng dòng trong JTable thì sẽ hiển thị thông tin chi tiết của sinh viên vào phần thông tin chi tiết.
- Nút Lưu tập tin cho phép lưu danh sách sinh viên xuống ổ cứng (map đối tượ ng) - NútMở tập tin cho phép load danh sách sinh viên trong tậ p tin lên JTable
- Nútthoát : khi nào ngườ i sử dụng chọn nút này thì sẽ hiển thị thông báo hỏi ngườ i sử dụng có chắc chắn muốn thoát hay không? Nếu muốn thoát thì sẽ đóng chương trình, nếu không thì giữ nguyên màn hình.
*** Chú ý, những bài này là tiền đề để vào chương JDBC chúng ta sẽ tiế p tục sử dụng lại, do đó sinh viên phải hiểu cách tạo giao diện, gán sự kiện cũng như cách sử dụng các
Tổ hợp công nghệ giáo dục Topica
Trang 39
Coding mẫu cho phần giao diện (phần xử lý thông tin sinh viên tự thự c hiện): package chap2.quanlysinhvien; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Font; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel;
public class QlsvUI extends JFrame{
private static final long serialVersionUID = 1L; JTextField txtMa,txtTen,txtNamsinh,txtDiachi,txtLop;
JButton btnThemmoi,btnLuu,btnXoa,btnMotaptin,btnLuutaptin,btnThoat; JTable tblSinhvien;
DefaultTableModel model;
public QlsvUI(String title) {
super(title); addControl(); }
public void addControl() {
Container con=getContentPane(); con.setLayout(new BorderLayout()); JPanel pnGeneral=new JPanel();
pnGeneral.setLayout(new BorderLayout()); con.add(pnGeneral,BorderLayout.CENTER); JPanel pnNorth=new JPanel();
pnNorth.setLayout(new BoxLayout(pnNorth, BoxLayout.Y_AXIS)); pnGeneral.add(pnNorth,BorderLayout.NORTH );
JPanel pnTitle=new JPanel();
JLabel lblTitle=new JLabel("Chương trình quản lý sinh viên"); lblTitle.setFont(new Font("arial", Font.BOLD, 20));
lblTitle.setForeground(Color.BLUE); pnTitle.add(lblTitle);
pnNorth.add(pnTitle);
JPanel pnDetail=new JPanel();
pnDetail.setLayout(new BoxLayout(pnDetail, BoxLayout.Y_AXIS));
pnDetail.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(C olor.BLUE), "Thông tin chi tiết"));
pnNorth.add(pnDetail); JPanel pnMa=new JPanel();
JLabel lblMa=new JLabel("Mã:"); pnMa.add(lblMa);
txtMa=new JTextField(20); pnMa.add(txtMa);
Tổ hợp công nghệ giáo dục Topica
pnDetail.add(pnMa);
JPanel pnTen=new JPanel();
JLabel lblTen=new JLabel("Tên:"); pnTen.add(lblTen);
txtTen=new JTextField(20); pnTen.add(txtTen);
pnDetail.add(pnTen);
JPanel pnNamsinh=new JPanel();
JLabel lblNamsinh=new JLabel("Năm sinh:"); pnNamsinh.add(lblNamsinh);
txtNamsinh=new JTextField(15); pnNamsinh.add(txtNamsinh);
JLabel lblFormat=new JLabel("(dd/MM/yyyy)");
lblFormat.setFont(new Font("arial", Font.PLAIN , 10)); pnNamsinh.add(lblFormat);
pnDetail.add(pnNamsinh); JPanel pnDiachi=new JPanel();
JLabel lblDiachi=new JLabel("Địa chỉ:"); pnDiachi.add(lblDiachi);
txtDiachi=new JTextField(20); pnDiachi.add(txtDiachi);
pnDetail.add(pnDiachi); JPanel pnLop=new JPanel();
JLabel lblLop=new JLabel("L ớ p:"); pnLop.add(lblLop);
txtLop=new JTextField(20); pnLop.add(txtLop);
pnDetail.add(pnLop);
JPanel pnButton1=new JPanel(); btnThemmoi=new JButton("Thêm"); btnLuu=new JButton("Lưu");
btnXoa =new JButton("Xóa"); pnButton1.add(btnThemmoi); pnButton1.add(btnLuu); pnButton1.add(btnXoa); pnDetail.add(pnButton1); JPanel pnTable=new JPanel();
pnTable.setLayout(new BorderLayout());
pnTable.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Co lor.BLUE), "Danh sách sinh viên"));
model=new DefaultTableModel(); model.addColumn("Mã");
model.addColumn("Tên"); model.addColumn("Năm sinh"); model.addColumn("Địa chỉ"); model.addColumn("L ớ p");
model.addRow(new String[]{"113","Lâm Sung","01/01/1970","Cà mau","CDTH10ALT"});
Tổ hợp công nghệ giáo dục Topica
Trang 41
tblSinhvien=new JTable(model);
JScrollPane sc=new JScrollPane(tblSinhvien,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); pnTable.add(sc,BorderLayout.CENTER);
pnGeneral.add(pnTable,BorderLayout.CENTER); JPanel pnButton2=new JPanel();
pnGeneral.add(pnButton2,BorderLayout.SOUTH ); pnButton2.setLayout(new BorderLayout()); JPanel pnIo=new JPanel();
pnButton2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder( Color.RED), "Nhập xuất"));
btnMotaptin =new JButton("Mở tập tin"); pnIo.add(btnMotaptin);
btnLuutaptin=new JButton("Lưu tập tin"); pnIo.add(btnLuutaptin);
pnButton2.add(pnIo,BorderLayout.WEST ); JPanel pnExit=new JPanel();
btnThoat=new JButton("Thoát"); pnExit.add(btnThoat); pnButton2.add(pnExit,BorderLayout.EAST ); lblMa.setPreferredSize(lblDiachi.getPreferredSize()); lblLop.setPreferredSize(lblDiachi.getPreferredSize()); lblTen.setPreferredSize(lblDiachi.getPreferredSize()); }
public void doShow() { setSize(600, 500); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); }
public static void main(String[] args) {
QlsvUI ui=new QlsvUI("Quản lý sinh viên"); ui.doShow();
} }
Bài tập 4: Thực hành với Hashtable.
Hashtable đi theo Key và Value. Nếu Key trùng nhau thì nó sẽ lấy theo Key thứ 2.
Hashtable cung cấp nhiều hàm hữu ích : put, get, remove, elements… tùy vào từng trường hợp
mà chúng ta ứng dụng cho phù hợp, dưới đây cung cấp một số ví dụ về Hashtable, yêu cầu sinh
viên thực hiện và cho nhận xét.
package chap1.myHashTable;
public class Person {
private String Id;
private String Name;
public String getId() {
return Id; }
Tổ hợp công nghệ giáo dục Topica
public void setId(String id) { Id = id;
}
public String getName() {
return Name; }
public void setName(String name) { Name = name;
}
public Person(String id, String name) {
super(); Id = id; Name = name; }
public String toString() {
return "Person [Id=" + Id + ", Name=" + Name + "]"; }
}
package chap1.myHashTable;
import java.util.Enumeration;
import java.util.Hashtable;
public class TestHashTable {
public static void main(String[] args) {
Hashtable<String, Person> hashTbl=new Hashtable<String, Person>(); hashTbl.put("1", new Person("1", "teo"));
Person p=new Person("2", "ty");
if(hashTbl.containsKey(p.getId())) {
System.out.println("Trung"); }
else
hashTbl.put(p.getId(), p); Person p2=new Person("3", "Nuong"); hashTbl.put(p2.getId(), p2);
hashTbl.remove("1");
System.out.println(hashTbl); Person px= hashTbl.get("3");
Enumeration<Person> list=hashTbl.elements();
while(list.hasMoreElements()) {
Person x=list.nextElement(); System.out.println(x);
} }
}
Sinh viên có thể dựa vào ví dụ này để đọc cơ sở dữ liệu và đổ vào Hashtable, với Key chính là khóa chính, còn Value chính là đối tượng trong từng dòng dữ liệu.
Tổ hợp công nghệ giáo dục Topica
Trang 43 Bài tập 6: Thực hành với HashSet , hãy so sánh sự khác biệt giữa HashSet , Hashtable và
ArrayList.
Sinh viên thực hiện ví dụ mẫu bên dưới, từ đó ứng dụng để viết chương trình quản lý sản phẩm.
package chap2.myHashSet;
public class Product {
private String Id;
private String Name;
private int Quantity;
private double UnitPrice;
public String getId() {
return Id; }
public void setId(String id) { Id = id;
}
public String getName() {
return Name; }
public void setName(String name) { Name = name;
}
public int getQuantity() {
return Quantity; }
public void setQuantity(int quantity) { Quantity = quantity;
}
public double getUnitPrice() {
return UnitPrice; }
public void setUnitPrice(double unitPrice) { UnitPrice = unitPrice;
}
public Product(String id, String name, int quantity, double unitPrice) {
super(); Id = id; Name = name; Quantity = quantity; UnitPrice = unitPrice; }
public String toString() {
return "Product [Id=" + Id + ", Name=" + Name + ", Quantity=" + Quantity + ", UnitPrice=" + UnitPrice + "]"; }
}
package chap2.myHashSet;
import java.util.HashSet;
import java.util.Iterator;
public class TestHashSet {
Tổ hợp công nghệ giáo dục Topica
HashSet<Product> myhs=new HashSet<Product>(); Product p1=new Product("p1", "Iphone 5", 2, 15); myhs.add(p1);
Product p2=new Product("p2", "Samsung sII",3, 11); myhs.add(p2);
System.out.println(myhs);
Iterator<Product> list= myhs.iterator();
while(list.hasNext()) {
Product x= list.next(); System.out.println(x); }
} }
Bài tập 7: Hiệu chỉnh bài tập 6, yêu cầu sử dụng LinkedHashSetđể quản lý sản phẩm. Sinh
viên hãy cho biết sự khác biệt giữa HashSet và LinkedHashSet.
Bài tập 8 : Viết chương trình biểu diễn 1 từ điển trong máy tính. Gợi ý: Sử dụng
TreeMap<String,WordObject> để lưu trữ tập các từ. Mỗi từ ở đây là 1 đối tượng gồm các thuộc
tính: từ (khóa của đối tượng), phát âm, loại từ, ghi chú. Kết quả như hình sau:
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
Trang 45 Trang 45 Bài tập 10:
Bài tập 10: Thực hành vềThực hành về PriorityQueuePriorityQueue Hãy sử dụng
Hãy sử dụng PriorityQueuePriorityQueue để quản lý độ ưu tiên công việc cần thực hiện. Những công việc nào có độđể quản lý độ ưu tiên công việc cần thực hiện. Những công việc nào có độ ưu tiên cao nhất thì được thực hiện trước.
ưu tiên cao nhất thì được thực hiện trước.
Bài tập
Bài tập 11:11: C Cải tiến bài tập 10ải tiến bài tập 10
Hãy sử dụng
Hãy sử dụng PriorityQueuePriorityQueue để quản lý độ ưu tiên và độ phức tạp của công việc.để quản lý độ ưu tiên và độ phức tạp của công việc.
-- N Nếếu công viu công việc nào có độệc nào có độ ưu tiên lớn hơn thì đượ ưu tiên lớn hơn thì đượ c thc thựực hic hiện trướ ện trướ cc
-- N Nếếu công viu công việc nào có cùng độệc nào có cùng độ ưu tiên thì tính theo độưu tiên thì tính theo độ ph phứức tc tạạ p, công vi p, công việệc nào cóc nào có độđộ ph phứứcc ttạạ p nhi p nhiềều nhu nhất thì đượ ất thì đượ c thc thựực hic hiện trướ ện trướ c.c.
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
MODULE
MODULE 4
4
Mục đích:
Mục đích:
Thực hành về Networking. Module nàThực hành về Networking. Module này giúp sinh viên hiểu được vềy giúp sinh viên hiểu được về InetAddress, Socket, RMIInetAddress, Socket, RMI
SOCKET
SOCKET PROGRAMMPROGRAMMINGING
Bài
Bài tậptập 1:1:
Viết 1 chương trình có tên Calculator_server nhận 1 biểu thức gồm 2 chữ số và 1 phép toán sau Viết 1 chương trình có tên Calculator_server nhận 1 biểu thức gồm 2 chữ số và 1 phép toán sau đó thực thi biểu thức này và gửi kết quả lại cho client.
đó thực thi biểu thức này và gửi kết quả lại cho client. Sữa chữa chương trình cho phép
Sữa chữa chương trình cho phép nhiều client kết nối cùng lúc.nhiều client kết nối cùng lúc.
Phía client, viết giao diện gồm 2 JtextField cho việc nhập số, 1 JLabel cho việc xuất kết quả. Phía client, viết giao diện gồm 2 JtextField cho việc nhập số, 1 JLabel cho việc xuất kết quả. Các nút Cộng, trừ, nhân,chia, clear
Các nút Cộng, trừ, nhân,chia, clear và thoát.và thoát. Giao diện cho client như sau:
Giao diện cho client như sau:
Bài tập 2: Bài tập 2:
Viết chương trình giải phương trình bậc 2, ser
Viết chương trình giải phương trình bậc 2, server lắng nghe tại port 8189, cho phéver lắng nghe tại port 8189, cho phép chạy nhiềup chạy nhiều client.
client. Yêu cầu viết theo 3 trường hợp (dùng Text Stream, Data Stream, Object Stream)Yêu cầu viết theo 3 trường hợp (dùng Text Stream, Data Stream, Object Stream) Giao Giao diện được cho như bên dưới:
diện được cho như bên dưới:
-- Khi bKhi bấấm nút Gim nút Giảải, server si, server sẽẽ tr tr ảả v vềề k k ếết qut quảả..
-- Khi bKhi bấấm nút Xóa tr m nút Xóa tr ắng, chương trình sẽắng, chương trình sẽ xóa tr xóa tr ắắng toàn bng toàn bộộ JTextField và focus t JTextField và focus tớ ớ i si sốố a. a. -- Khi chKhi chọn nút Thoát, chương trình sẽọn nút Thoát, chương trình sẽ h hỏi ngườ ỏi ngườ i si sửử d dụụng có mung có muốốn thoát hay không.n thoát hay không.
Tổ hợp công nghệ giáo dục Topica Tổ hợp công nghệ giáo dục Topica
Trang 47 Trang 47 Class
Class CServerThreadPtb2TextStreamCServerThreadPtb2TextStreamdùng đểdùng để ch chạy đa tiếạy đa tiến trình cho Test Serverrn trình cho Test Serverr package
package duythanhworduythanhwordpress.com.dpress.com.chapter3.ptchapter3.ptb2textstreab2textstream;m;
import
import java.io.IOException; java.io.IOException;
import
import java.io.InputStream; java.io.InputStream;
import
import java.io.OutputStream; java.io.OutputStream;
import
import java.io.PrintWriter; java.io.PrintWriter;
import
import java.net.Sjava.net.Socket;ocket;
import
import java.util.Scanner; java.util.Scanner;
public
public classclass CServerThreadPtb2TextStream CServerThreadPtb2TextStream implementsimplements Runnable Runnable {
{
private
private Socket Socket m_socm_soc;;
public
public CServerThreadPtb2TextCServerThreadPtb2TextStream(Socket soc)Stream(Socket soc) {
{
m_soc
m_soc=soc;=soc; }
}
private
private String String processInfprocessInfomation(omation(doubledouble a, a,doubledouble b, b,doubledouble c) c) { { String sKQ= String sKQ="""";; if if(a==0)(a==0) { { if if(b==0)(b==0) { { if if(c==0)(c==0) sKQ= sKQ="Phương Trình có Vô số"Phương Trình có Vô số nghi nghiệệm"m";; else else sKQ= sKQ="Phương trình vô nghị"Phương trình vô nghịêm"êm";; } } else else { { String
String sFormat=StrisFormat=String.ng. format format(("%10.2f""%10.2f", -c/b);, -c/b); sKQ= sKQ="Pt có 1 no x=""Pt có 1 no x="+sFormat;+sFormat; } } } } else else { { double
double delta=Math. delta=Math. pow pow (b, 2)-4*a*c;(b, 2)-4*a*c;
if if(delta<0)(delta<0) { { sKQ= sKQ="Phương trình vô nghiệ"Phương trình vô nghiệm"m";; } } else
else ifif(delta==0)(delta==0) {
{
String
String sFormat=StrisFormat=String.ng. format format(("%10.2f""%10.2f", -b/(2*a));, -b/(2*a)); sKQ=
sKQ="Phương trình có nghiệ"Phương trình có nghiệm kép x1=x2="m kép x1=x2="+sFormat;+sFormat; } } else else { { double
double x1=(-b-Math. x1=(-b-Math.sqrtsqrt(delta))/(2*a);(delta))/(2*a);
double
double x2=(-b+Math. x2=(-b+Math.sqrtsqrt(delta))/(2*a);(delta))/(2*a); String
String sFormat1=StrsFormat1=String.ing. format format(("%10.2f""%10.2f", x1);, x1); String sFormat2=String.
String sFormat2=String. format format(("%10.2f""%10.2f", x2);, x2); sKQ =
sKQ ="phương trình có 2 nghiệ"phương trình có 2 nghiệm x1="m x1="+sFormat1 ++sFormat1 +" ; x2="" ; x2="+sFormat2;+sFormat2; } } } } return return sKQ; sKQ; } } @Override @Override public
public voidvoid run() run() {
Tổ hợp công nghệ giáo dục Topica
try
{
InputStream in=m_soc.getInputStream(); Scanner sc=new Scanner(in);
double a=sc.nextDouble();
double b=sc.nextDouble();
double c=sc.nextDouble();
String sKq=processInfomation(a,b,c);
OutputStream out=m_soc.getOutputStream();
PrintWriter printOut=new PrintWriter(out,true); printOut.println(sKq);
m_soc.close(); }
catch(IOException ex) {
ex.printStackTrace(); }
catch(Exception ex) {
ex.printStackTrace(); }
} }
Class CClientPtb2TextStreamdùng để chạy Test Client package duythanhwordpress.com.chapter3.ptb2textstream; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField;
public class CClientPtb2TextStream extends JFrame {
private static final long serialVersionUID = 1L;
private JButton btnSend,btnClear,btnExit;
private JTextField txta,txtb,txtc,txtkq;
public CClientPtb2TextStream() {
Tổ hợp công nghệ giáo dục Topica
Trang 49
{
setLayout(new BorderLayout()); JPanel pnNorth=new JPanel();
pnNorth.setBackground(Color.CYAN );
JLabel lblNorth=new JLabel("Giải Phương Trình Bậc 2"); pnNorth.add(lblNorth);
Container con=getContentPane(); con.add(pnNorth,BorderLayout.NORTH ); JPanel pnCenter=new JPanel();
con.add(pnCenter,BorderLayout.CENTER); JPanel pnInfor=new JPanel();
pnInfor.setLayout(new BoxLayout(pnInfor, BoxLayout.Y_AXIS)); pnCenter.add(pnInfor);
JPanel pna=new JPanel(); JLabel lbla=new JLabel("a:"); txta=new JTextField(15); pna.add(lbla);
pna.add(txta); pnInfor.add(pna);
pnInfor.add(Box.createRigidArea(new Dimension(0,5))); JPanel pnb=new JPanel();
JLabel lblb=new JLabel("b:"); txtb=new JTextField(15); pnb.add(lblb);
pnb.add(txtb); pnInfor.add(pnb);
pnInfor.add(Box.createRigidArea(new Dimension(0,5))); JPanel pnc=new JPanel();
JLabel lblc=new JLabel("c:"); txtc=new JTextField(15); pnc.add(lblc);
pnc.add(txtc); pnInfor.add(pnc);
pnInfor.add(Box.createRigidArea(new Dimension(0,20))); JLabel lblkq=new JLabel("kết quả:");
lblkq.setAlignmentX(JLabel.CENTER_ALIGNMENT );
lblkq.setFont(new Font("Arial", Font.BOLD | Font.ITALIC , 25)); txtkq=new JTextField(15);
txtkq.setEditable(false); pnInfor.add(lblkq);
pnInfor.add(txtkq);
pnInfor.add(Box.createRigidArea(new Dimension(0,20))); JPanel pnButton=new JPanel();
btnSend=new JButton("Send");
btnSend.addActionListener(new CMyEvent()); btnClear=new JButton("Clear");
btnClear.addActionListener(new CMyEvent()); btnExit=new JButton("Exit");
btnExit.addActionListener(new CMyEvent()); pnButton.add(btnSend);
pnButton.add(btnClear); pnButton.add(btnExit); pnInfor.add(pnButton); }
Tổ hợp công nghệ giáo dục Topica
private void clearText() {
txta.setText(""); txtb.setText(""); txtc.setText(""); }
private void proccessInformation() {
try
{
Socket soc=new Socket("localhost",8189); //Send Information to server
OutputStream out=soc.getOutputStream();
PrintWriter printOut=new PrintWriter(out,true);
printOut.println(Double. parseDouble(txta.getText())); printOut.println(Double. parseDouble(txtb.getText())); printOut.println(Double. parseDouble(txtc.getText())); //Get information from server
InputStream in=soc.getInputStream();
java.util.Scanner sc=new java.util.Scanner(in); txtkq.setText(sc.nextLine());
soc.close(); }
catch(IOException ex) {
JOptionPane.showMessageDialog(this, ex.getMessage()); }
catch(Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage()); }
}
private class CMyEvent implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub Object o=arg0.getSource(); if(o.equals(btnSend)) { proccessInformation(); } else if(o.equals(btnClear)) { clearText(); } else if(o.equals(btnExit)) { System.exit(0); } } }
Tổ hợp công nghệ giáo dục Topica
Trang 51
public static void main(String[] args) {
// TODO Auto-generated method stub
CClientPtb2TextStream client=new CClientPtb2TextStream(); client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); client.setSize(400, 300);
client.setVisible(true); }
}
Class CServerPtb2TextStreamdùng để chạy Test Server package duythanhwordpress.com.chapter3.ptb2textstream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class CServerPtb2TextStream {
public static void main(String[] args) {
try
{
ServerSocket server=new ServerSocket(8189);
System.out.println("Starting PTB2..."+server.getLocalPort());
while(true) {
Socket soc=server.accept();
CServerThreadPtb2TextStream srv=new CServerThreadPtb2TextStream(soc); Thread t=new Thread(srv);
Thread.sleep(100); t.start();
}
}catch(IOException ex) {
ex.printStackTrace(); }
catch(InterruptedException ex) {
ex.printStackTrace(); }
catch(Exception ex) {
ex.printStackTrace(); }
} }
Tới đây Sinh viên chạy class Test Server (CServerPtb2TextStream) trước, sau đó chạy class
Tổ hợp công nghệ giáo dục Topica
- Trườ ng hợ p sử dụng Data Stream, sửa lại 2 chỗ gửi/ nhận bên Client và Server như sau: Bên client :
private void doSend() {
try
{
Socket soc=new Socket("localhost",8189); OutputStream out=soc.getOutputStream();
DataOutputStream dataout=new DataOutputStream(out); dataout.writeDouble(Double. parseDouble(txta.getText())); dataout.writeDouble(Double. parseDouble(txtb.getText())); dataout.writeDouble(Double. parseDouble(txtc.getText())); InputStream in=soc.getInputStream();
DataInputStream datain=new DataInputStream(in); txtkq.setText(datain.readUTF());
soc.close(); }
catch(IOException ex) {
JOptionPane.showMessageDialog(this, ex.getMessage()); }
catch(Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage()); }
}
Bên Server:
public void run() {
try
{
InputStream in=m_soc.getInputStream();
DataInputStream datain=new DataInputStream(in); String strKq=processInformation
(datain.readDouble(), datain.readDouble(), datain.readDouble()); OutputStream out=m_soc.getOutputStream();
DataOutputStream dataout=new DataOutputStream(out); dataout.writeUTF(strKq);
m_soc.close(); }
catch(IOException ex) {
ex.printStackTrace(); }
catch(Exception ex) {
ex.printStackTrace(); }
}
Tổ hợp công nghệ giáo dục Topica
Trang 53
- Trườ ng hợ p sử dụng Object Stream, Ta nên viết 1 class tên là CPTB2, class này implements Serializable. Sau đó sửa lại 2 chỗ gửi/ nhận bên Client và Server như sau: Bên client :
private void doSend() {
try
{
Socket soc=new Socket("localhost",8189); OutputStream out=soc.getOutputStream();
ObjectOutputStream objout=new ObjectOutputStream(out); CPTB2 pt2=new CPTB2(
Double. parseDouble(txta.getText()), Double. parseDouble(txtb.getText()), Double. parseDouble(txtc.getText())); objout.writeObject(pt2);
InputStream in=soc.getInputStream();
ObjectInputStream objin=new ObjectInputStream(in); CPTB2 pt2FromServer=(CPTB2) objin.readObject(); txtkq.setText(pt2FromServer.getKetQua());
soc.close(); }
catch(IOException ex) {
ex.printStackTrace(); }
catch(Exception ex) {
ex.printStackTrace(); }
} Bên Server:
public void run() {
try
{
InputStream in=m_soc.getInputStream();
ObjectInputStream objin=new ObjectInputStream(in); CPTB2 pt2=(CPTB2) objin.readObject();
pt2.comPute();
OutputStream out=m_soc.getOutputStream();
ObjectOutputStream objout=new ObjectOutputStream(out); objout.writeObject(pt2);
m_soc.close(); }
catch(IOException ex) {
ex.printStackTrace(); }
catch(Exception ex) {
ex.printStackTrace(); }