package gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import qlsv.Book;
import qlsv.Shelf;
import qlsv.LibRoom;
import db.Database;
@SuppressWarnings(“all”)
public class BookMS extends JFrame implements ActionListener, TreeSelectionListener, ListSelectionListener{
private final String DB_NAME=”lib.db”;
private DefaultMutableTreeNode root;
private DefaultTreeModel treeModel;
private JTree tree;
private DefaultListModel dlmBook;
private JList lstBook;
private JTextField tfID,tfTitle,tfAuthor,tfPages;
private JButton btThem,btLuu,btSua,btXoa;
private JButton btAddShelf,btRemShelf;
private LibRoom db=null;//dùng nạp toàn bộ csdl
private Shelf selShelf=null;
public BookMS() {
super(“Quản lý thư viện”);
addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent arg0) {
//lưu csdl
SaveDB();
//thoat
System.exit(1);
}
});
setSize(600,400);
TaoHeader();
TaoGUI();
LoadDB();
/*db.AddShelf(new Shelf(“s01″,”Tiểu thuyết 3 xu”));
db.AddShelf(new Shelf(“s02″,”Sách Tin học”));
db.AddShelf(new Shelf(“s03″,”Sách Ngoại ngữ”));*/
LockText(true);//không cho sửa
}
/**
* Hàm này thực thi khi bắt đầu chạy chương trình
*/
void LoadDB(){
try {
if(!new File(DB_NAME).exists()){//chưa tồn tại csdl
db=new LibRoom(“bien hoa”,”room001″);
}
else{
Database b=new Database();
db=(LibRoom)b.DeserialObject(DB_NAME);
//xây dựng tree
BuildTree();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Lỗi nạp CSDL”);
}
}
/**
* Xây dựng tree dựa trên DB
*/
void BuildTree() {
root.removeAllChildren();
for (int i = 0; i < db.Count(); i++) {
Shelf sf=db.getShelf(i);
root.add(new DefaultMutableTreeNode(sf));
}
tree.updateUI();//cập nhật lên jtree
}
/**
* Chạy khi kết chương trình
* dùng để update dữ liệu xuống file
*/
void SaveDB(){
try {
new Database().SerialObject(db, DB_NAME);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, “Lỗi lưu CSDL”);
}
}
void TaoHeader(){
JLabel lbl=new JLabel(“LIBRARY MANAGMENT SYSTEM”,JLabel.CENTER);
lbl.setFont(new Font(“Arial”,Font.BOLD,30));
lbl.setForeground(Color.blue);
this.add(lbl,BorderLayout.NORTH);
}
void TaoGUI(){
//tạo tree
root=new DefaultMutableTreeNode(“Lib room”);
treeModel=new DefaultTreeModel(root);
tree=new JTree(treeModel);
tree.addTreeSelectionListener(this);
JScrollPane treePane=new JScrollPane(tree);
JPanel pLeft=new JPanel(new BorderLayout());
pLeft.add(treePane,BorderLayout.CENTER);
JPanel pFunc=new JPanel();
pFunc.add(btAddShelf=new JButton(“Add Shelf”));
pFunc.add(btRemShelf=new JButton(“Remove Shelf”));
btAddShelf.addActionListener(this);
btRemShelf.addActionListener(this);
pLeft.add(pFunc,BorderLayout.SOUTH);
JPanel pCen=new JPanel(new BorderLayout());
JSplitPane spPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,pLeft,pCen);
this.add(spPane,BorderLayout.CENTER);
//Pane details
JPanel pList=new JPanel(new BorderLayout());
JPanel pDetails=new JPanel(new BorderLayout());
pList.setBorder(BorderFactory.createTitledBorder(“Book listing…”));
pDetails.setBorder(BorderFactory.createTitledBorder(“Selected book informations”));
pCen.add(pList,BorderLayout.CENTER);
pCen.add(pDetails,BorderLayout.SOUTH);
//Them list book
dlmBook=new DefaultListModel();
lstBook=new JList(dlmBook);
pList.add(new JScrollPane(lstBook));
lstBook.setPreferredSize(new Dimension(200,200));
lstBook.addListSelectionListener(this);
//tạo details
Box b=Box.createVerticalBox();
Box b1=Box.createHorizontalBox();
Box b2=Box.createHorizontalBox();
Box b3=Box.createHorizontalBox();
Box b4=Box.createHorizontalBox();
Box b5=Box.createHorizontalBox();
b.add(b1);b.add(Box.createVerticalStrut(7));
b.add(b2);b.add(Box.createVerticalStrut(7));
b.add(b3);b.add(Box.createVerticalStrut(7));
b.add(b4);b.add(Box.createVerticalStrut(7));
b.add(b5);b.add(Box.createVerticalStrut(7));
JLabel l1,l2,l3,l4;
b1.add(l1=new JLabel(“Book ID:”,JLabel.RIGHT));b1.add(tfID=new JTextField(20));
b2.add(l2=new JLabel(“Title:”,JLabel.RIGHT));b2.add(tfTitle=new JTextField(20));
b3.add(l3=new JLabel(“Author:”,JLabel.RIGHT));b3.add(tfAuthor=new JTextField(20));
b4.add(l4=new JLabel(“No. Pages:”,JLabel.RIGHT));b4.add(tfPages=new JTextField(20));
l1.setPreferredSize(l4.getPreferredSize());
l2.setPreferredSize(l4.getPreferredSize());
l3.setPreferredSize(l4.getPreferredSize());
b5.add(btThem=new JButton(“Thêm”));btThem.addActionListener(this);
b5.add(btLuu=new JButton(“Lưu”));btLuu.addActionListener(this);btLuu.setEnabled(false);
b5.add(btSua=new JButton(“Sửa”));btSua.addActionListener(this);
b5.add(btXoa=new JButton(“Xóa”));btXoa.addActionListener(this);
pDetails.add(b,BorderLayout.CENTER);
}
private void LockText(boolean status){
tfID.setEditable(!status);
tfPages.setEditable(!status);
tfTitle.setEditable(!status);
tfAuthor.setEditable(!status);
}
@Override
public void actionPerformed(ActionEvent e) {
Object o=e.getSource();
if(o.equals(btAddShelf)) {
String sID=JOptionPane.showInputDialog(“Nhập Mã số kệ:”);
String sName=JOptionPane.showInputDialog(“Nhập tên kệ:”);
if(sID==null||sName==null)
return;
if(sID.trim().equals(“”)||sName.trim().equals(“”)) {
JOptionPane.showMessageDialog(null, “Cần nhập thông tin đầy đủ mới lưu được”);
return;
}
Shelf sf=new Shelf(sID,sName);
if(db.AddShelf(sf)) {
BuildTree();
}
else
JOptionPane.showMessageDialog(null, “Không thêm được kệ sách này”);
}
else if(o.equals(btRemShelf)) {
try {
if(selShelf==null) {
JOptionPane.showMessageDialog(null, “Chọn kệ sách cần xóa trước đã”);
return;
}
if(JOptionPane.showConfirmDialog(null,
“Bạn chắc chắn xóa cuốn sách này chứ?”,
“Xác nhận”,JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE)==JOptionPane.YES_OPTION) {
DefaultMutableTreeNode selNode=(DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
root.remove(selNode);
if(db.RemoveShelf(selShelf.getShelfID()))
BuildTree();
}
}catch (Exception ex) {
JOptionPane.showMessageDialog(null, “Không xóa được”);
System.out.println(ex);
}
}
else if(o.equals(btThem)){
if(btThem.getText().equalsIgnoreCase(“Thêm”)){
btThem.setText(“Hủy bỏ”);
btLuu.setEnabled(true);
btXoa.setEnabled(false);
btSua.setEnabled(false);
LockText(false);
}else{
btThem.setText(“Thêm”);
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btSua.setEnabled(true);
LockText(true);
}
}
else if(o.equals(btLuu)){
if(tfID.getText().trim().equals(“”)||
tfTitle.getText().trim().equals(“”)||
tfAuthor.getText().trim().equals(“”)||
tfPages.getText().trim().equals(“”)){
JOptionPane.showMessageDialog(null, “Không được để trống”);
return;
}
int pages=0;
try {
pages = Integer.parseInt(tfPages.getText());
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, “Phải nhập số nguyên vào số trang”);
tfPages.selectAll();tfPages.requestFocus();
return;
}
if(btThem.isEnabled()){//nút lưu của nút thêm
Book b=new Book(tfID.getText(),tfTitle.getText(),
tfAuthor.getText(),pages);
if(selShelf!=null){
if(selShelf.AddBook(b)) {
dlmBook.addElement(b);
//khôi phục tình trạng
btThem.setText(“Thêm”);
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btSua.setEnabled(true);
LockText(true);
}
else
JOptionPane.showMessageDialog(null, “Không thêm được. Trùng khóa”);
}
else
JOptionPane.showMessageDialog(null, “Phải chọn kệ trước”);
}
else{//nút lưu là của nút sửa
if(selShelf!=null) {
Book b=new Book(tfID.getText(),tfTitle.getText(),
tfAuthor.getText(),Integer.parseInt(tfPages.getText()));
if(!selShelf.UpdateBookInfos(tfID.getText(), b))
JOptionPane.showMessageDialog(null, “Không update được”);
else {
BuildList();
btSua.setText(“Sửa”);
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btThem.setEnabled(true);
LockText(true);
lstBook.setEnabled(true);
tree.setEnabled(true);
}
}
else
JOptionPane.showMessageDialog(null, “Không update được. Chọn kệ trước”);
}
}
else if(o.equals(btSua)) {
if(tfID.getText().trim().equals(“”)) {
JOptionPane.showMessageDialog(null, “Hãy chọn sách cần sửa thông tin trước”);
return;
}
if(btSua.getText().equalsIgnoreCase(“Sửa”)){
btSua.setText(“Hủy bỏ”);
btLuu.setEnabled(true);
btXoa.setEnabled(false);
btThem.setEnabled(false);
LockText(false);tfID.setEditable(false);
lstBook.setEnabled(false);
tree.setEnabled(false);
}else{
btSua.setText(“Sửa”);
btLuu.setEnabled(false);
btXoa.setEnabled(true);
btThem.setEnabled(true);
LockText(true);
lstBook.setEnabled(true);
tree.setEnabled(true);
}
}
else if(o.equals(btXoa)) {
String id=tfID.getText();
if(id.trim().equals(“”)) {
JOptionPane.showMessageDialog(null, “Bạn cần chọn cuốn sách cần gỡ bỏ trước đã”);
return;
}
if(JOptionPane.showConfirmDialog(null,
“Bạn chắc chắn xóa cuốn sách này chứ?”,
“Xác nhận”,JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE)==JOptionPane.YES_OPTION) {
if(!selShelf.RemoveBook(id))
JOptionPane.showMessageDialog(null, “Không xóa được”);
else {
BuildList();
}
}
}
}
//khi chọn lên tree sẽ liệt kê các sách của kệ đang chọn
@Override
public void valueChanged(TreeSelectionEvent te) {
try {
DefaultMutableTreeNode selNode=(DefaultMutableTreeNode)tree.getSelectionPath().getLastPathComponent();
if(selNode.getLevel()>0) {
selShelf=(Shelf)selNode.getUserObject();
//đưa danh sách các book vào list
BuildList();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private void BuildList() {
dlmBook.clear();
for (int i = 0; i < selShelf.Count(); i++) {
Book b=selShelf.GetBook(i);
dlmBook.addElement(b);
}
}
//Khi chọn lên 1 cuốn sách trong jlist
//sẽ hiển thị thông tin chi tiết trên các textfield
@Override
public void valueChanged(ListSelectionEvent arg0) {
try {
Book selBook=(Book)lstBook.getSelectedValue();
if(selBook!=null) {
tfID.setText(selBook.getBookID());
tfTitle.setText(selBook.getBookTitle());
tfAuthor.setText(selBook.getAuthorName());
tfPages.setText(selBook.getNoPages()+””);
}
} catch (Exception e) {
e.printStackTrace();
}
}
} |
unknown said
Cho em hỏi những dòng này có tác dụng gì, nếu ko có thì trong eclipse sẽ báo có vấn đề.
Thầy có thể nói 1 chút về nó được ko a.
private static final long serialVersionUID = 1L;
và
@SuppressWarnings(”all”)
phamdung said
thưa thầy, em làm đúng theo các bước của thầy, sau khi xong thì chương trình báo chưa có cơ sở dữ liệu Database. xin thầy giúp đỡ .
cannot find symbol
symbol: class Database
location:packer qlsv
import from the same packer
vovanhai said
package db;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Database {
public void SerialObject(Object obj,String filename)throws Exception{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(filename));
oos.writeObject(obj);
oos.close();
}
public Object DeserialObject(String filename)throws Exception{
Object obj=null;
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(filename));
obj=ois.readObject();
return obj;
}
}
phamTung said
Thưa thầy,khi mình dùng elip để viết gia diện thì khi chay chuong trình mình muốn cai frame nằm ở giữa màn hình,và muốn thiết lập màu nền cái frame đó mình làm sao ạ,xin thầy giúp e ,e cảm ơn thầy.
PhamTung said
Thưa thầy,e dùng elip viết chuong trình ứng dung java,e muốn thiết lập Frame luôn xuất hiện ỡ giữa màn hinh khi e chạy project,va muốn khoá cái frame (mình ko cho ngừoi sử dụng phần mềm thu nhỏ hoặc phóng to ra),mình phải làm thế nào vậy thầy..e mong chờ hồi âm của thầy,e xin cảm ơn thầy.
vovanhai said
1. Dùng phương thức setLocation(x,y) để chỉ vị trí. Ngoài ra dùng phương thức getToolkit().getScreenSize() để lấy kích thước màn hình.
2. Dùng phương thức setResizable(false);
Phamtung said
Da,e làm được rồi…e cảm ơn thầy nhiều.
Pham said
Em chào thầy!
Thầy cho em hỏi cách load fie text có font chữ tiếng việt và các thuộc tính của font: bold, italic,…
vovanhai said
Đối tượng Scanner em chỉ định encoding:
Scanner sc=new Scanner(new FileInputStream(“filename.txt”),”UTF-8″)
Pham said
Em chào thầy!
Em muốn load file text tiếng việt và các thuộc tính của font trong J2ME.
Trong Java có hàm Scanner, nhưng trong J2ME không có hàm Scanner.
Giờ em đã load file text tiếng việt rồi. Tuy nhiên, em chỉ dùng được thuộc tính underline thôi. Còn các thuộc tính khác: bold, italic, plain ko dùng được.
Thầy có cách nào không ạ?
Nguyễn Phúc Thái said
Thầy ! em muốn viêt tiếng việt trong java thì làm sao , cấu hình JCreater 4.5 ra sao để hiểu được kiểu mã Utf-8 …mình tìm hoài mà không thấy đâu cả
Thanks Thầy!
Võ Văn Hải said
Quên cái JCreator Pro di. Dùng Eclipse đi cho nó lành.
Nguyễn Phúc Thái said
Thầy em muốn set border cho panel thì làm sao , em dung kiểu nulllayout …
Võ Văn Hải said
Em dùng BorderFactory để tạo Border. ví dụ
panel.setBorder(Borderfactory.createTitleBorder("demo title"));
Jimmy said
Nhờ thầy chỉ cho em cách tạo ra dòng chữ “…running” tren GUI khi chương trình đang chạy
và dòng chữ “completed” khi chạy xong
Võ Văn Hải said
Không hiểu là bạn muốn nói đến cái gì cao siêu hay cái gì quá đơn giản?
Nếu đơn giản thì bạn hiển thị ra JLabel chẳng hạn 1 dòng running sau đó bạn gọi Thread.sleep(100) sau đó là code thực thi. XOng thì bạn in ra chữ completed.
Còn nếu bạn làm gì đó cao siêu hơn thì bạn nghiên cứu đa tiến trình (Threading).
Tysuu said
private final String DB_NAME=”lib.db”;
Làm ơn giải thích hộ mình code này!!!!!!
Sao trình biên dịch thông báo lỗi : “package lib does not exist”
Phải làm như thế nào ạ?
Hung said
Thầy chỉ dùm em cách tạo biểu tượng file browser bên tay phải JTextfield, hiển thị đường dẫn lên jtextfiled sau khi chọn file. Cám ơn thầy nhiều
Hung said
Em có class CongViec{…. void search ()….} trong khi đang search thì hiện lên progress bar, phần trăm công việc thực hiện.Nhờ thầy cho một ví dụ như vậy để minh họa.Cám ơn thầy nhiều
TraXanh said
Scroll có hiện lên từng cell rồi ,nhưng không kéo lên, kéo xuống được.Nhờ thầy help em
private class ExtendedTableCellEditor extends AbstractCellEditor implements TableCellEditor
{
JTextArea area = new JTextarea;
String text;
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int vColIndex)
{
area.setText(text);
return new JScrollPane(area);
}
public Object getCellEditorValue()
{
return text;
}
}
Anh Nguyễn said
Em muốn hỏi thầy chút ạ, làm sao để hiển thị phần Design trong NetBeans với 1 file .java có chứa code GUI ? Em có một folder của 1 ứng dụng có giao diện, folder này có nhiều file .java khác nhau, em đã add chúng vào 1 package và chạy được trong NetBeans, hiện em muốn chỉnh lại giao diện nhưng không thấy hiện phần Design khi em click vào file .java có chứa code GUI. Mong thầy giúp đỡ ạ, em cảm ơn thầy.
Jimmy said
Nhờ thầy chỉ cách tạo progressBar, update value từ chương trình ,dùng đa tiến trình,theo mẫu dưới đây
Class My progressbar {
new Thread(new Runnable()
{
public void run()
{
// do some thing
}
}).start();
}
Class coreProgram {
void do()
{
while(doing the job)
{
// send value to progress Bar
}
}}
ha said
thay cho e hoi JSplitPane dung de lam gi va ca additem nua?