Tự động tạo các thành phần cho Class bằng Lombok trong Eclipse

Java cũng như các ngôn ngữ lập trình hướng đối tượng khác, lúc khai báo Lớp và các thuộc tính ta cần viết các getter/setter, constructor… những thao tác này hầu như là nhàm chán và phải bắt buộc làm.

có rất nhiều thư viện giúp chúng ta giảm thiểu công đoạn này. Lombok là một trong các công cụ đó, nó giúp ta tự động tạo ra các thành phần của class. Với Lombok, ta chỉ cần khai báo cấu trúc dữ liệu của 1 Class, còn mọi thứ trong class đã có Lombok lo.

Dưới đây là các bước hướng dẫn chi tiết quá trình sử dụng Lombok trong Eclipse, chỉ cần cài plug-in lần đầu, các lần sau các bạn sẽ sử dụng nó một cách nhanh chóng.

Đầu tiên các bạn vào menu Help/chọn Install New Software… như hình dưới đây:

Màn hình Install hiển thị ra như dưới đây:

ta nhập https://projectlombok.org/p2 để cài đặt. nhìn thấy nút “Add”–>bấm vào nó:

Name: nhập https://projectlombok.org/p2

Location: nhập https://projectlombok.org/p2

Sau đó nhấn Add, các bạn chờ cho Eclipse tải xong Plug-in thì thấy thư viện Lombok như hình bên dưới:

Nhấn Next để tiếp tục, Tiếp tục chờ Eclipse cài đặt, sẽ thấy thông báo như dưới đây:

Nhấn Next để tiếp tục:

Chọn “I accept the terms of the license agreement” rồi bấm Finish

Nếu Eclipse có hỏi um xùm gì đó thì cứ bấm “Accept selected”

rồi khởi động lại Eclipse như chương trình yêu cầu:

Bước tiếp theo ta tải thư viện “lombok.jar” về để tham chiếu vào phần mềm, làm như sau:

Vào https://projectlombok.org/download tải bản mới nhất:

tải trực tiếp: https://projectlombok.org/downloads/lombok.jar

Lưu thư viện này vào máy tính để xíu nữa tham chiếu vào dự án.

Tạo dự án tên “TestLombok” như hình dưới đây:

Với mỗi dự án, bạn muốn dùng Lombok thì cứ Tạo một thư mục tên là “libs” rồi sao chép thư viện đó vào libs (bấm chuột phải vào Project / chọn New / chọn Folder):

Rồi đặt thư mục là libs:

Mục Folder name: đặt tên là libs

Sau đó nhấn Finish, ta thấy thư mục libs sẽ được đưa vào dự án như hình dưới đây:

Bây giờ các bạn copy thư viện “lombok.jar” đã tải vào thư mục libs (chỉ cần control+C và control+V thôi).

Tiếp theo ta cần tham chiếu lombok.jar và dự án:

Bấm chuột phải vào lombok.jar/ chọn Build Path / chọn Add to Build Path

Sau khi bấm xong thì thư viện sẽ được tham chiếu vào như sau, nó có rất nhiều lớp:

Tiếp theo tạo package và class cho dự án, ví dụ dưới này Tui có tạo:

Package name: tranduythanh.com.model

class name: SanPham

Ở trên các bạn thấy, lớp SanPham có 5 thuộc tính: ma, ten,soLuong,donGia, và ngayNhap:

[code language=”java”]
package tranduythanh.com.model;

import java.util.Date;
public class SanPham {
private int ma;
private String ten;
private int soLuong;
private double donGia;
private Date ngayNhap;
}

[/code]

thông thường, các bạn phải làm đầy đủ getter/setter, constructor…

với Lombok thì mọi thứ đơn giản, ta chỉ cần khai báo các notation cho nó là đủ:

Ở trên ta thấy:

@AllArgsConstructor tự động tạo ra constructor đầy đủ đổi số.

@NoArgsConstructor tự động tạo ra constructor mặc định

@Data tự động tạo mọi getter/setter cho class

[code language=”java”]
package tranduythanh.com.model;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class SanPham {
private int ma;
private String ten;
private int soLuong;
private double donGia;
private Date ngayNhap;
}

[/code]

Tiếp theo, ta thử test lớp SanPham bằng cách tạo ra lớp TestSanPham:

Tạo package tên “tranduythanh.com.test”, trong này tạo 1 lớp tên là “TestSanPham”.

Code mẫu chi tiết như sau:

Rõ ràng ta Sản phẩm tự động có các getter/setter, constructor… tiết kiệm rất nhiều thời gian cho Lập trình viên khi phải viết dự án với rất nhiều lớp.

code chi tiết:

[code language=”java”]
package tranduythanh.com.test;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import tranduythanh.com.model.SanPham;

public class TestSanPham {
public static void main(String[] args) {
SanPham sp1=new SanPham();
sp1.setMa(1);
sp1.setTen(“Coca”);
sp1.setSoLuong(100);
sp1.setDonGia(25);
System.out.println(sp1);
System.out.println(“Tên sản phẩm =”+sp1.getTen());
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, 8);
cal.set(Calendar.DATE, 20);
SanPham sp2=new SanPham(2, “Pepsi”, 50, 17, cal.getTime());
System.out.println(sp2);
SimpleDateFormat sdf=new SimpleDateFormat(“dd/MM/yyyy”);
System.out.println(“Tên sản phẩm 2=”+sp2.getTen());
System.out.println(“Ngày nhập sản phẩm 2=”+sdf.format(sp2.getNgayNhap()));
}
}

[/code]

kết quả khi chạy chương trình:

Như vậy Tui đã hướng dẫn xong các bạn cách dùng thư viện Lombok trong Eclipse để tự động tạo ra các thành phần cho Class nhằm tránh nhàm chán và tiết kiệm thời gian.

Các bạn chỉ cần cài plug-in 1 lần là xong, các lần sau chỉ cần tham chiếu tới thư viện lombok.jar nếu muốn dự án đó làm theo lombok.

Dưới đây là coding mẫu của bài: http://www.mediafire.com/file/oiehylc20gxp4li/TestLombok.rar/file

Chúc bạn thành công.

Ví dụ mẫu mở các JFrame hay JDialog khác trong Java1

Trong topic này Tôi muốn hướng dẫn các bạn cách mở các cửa sổ windows khác trong Java .

Tình huống: Bạn quan sát hình Tôi chụp bên dưới, từ 1 cửa sổ chính chứa 2 JButton, mỗi JButton sẽ có chức năng mở các cửa sổ khác nhau. Ở đây Tôi muốn hướng dẫn 2 tình huống đó là mở 1 JFrame và 1 JDialog khác để từ đó các bạn có thể tham khảo áp dụng cho các chương trình tương tự. Bạn phải biết được sự khác biết giữa JFrame và JDialog (mặc định Tôi cho là các bạn đã biết  )

———————————————————————————————————————————————-

Tôi cung cấp cho các bạn 3 class:

class MyMainUI sẽ chứa 2 JButton : Open MyUI1 và Open MyUI2

class MyUI1 kế thừa từ JFrame

class MyUI2 kế thừa từ JDialog

Các bạn quan sát sự kiện tôi gán cho 2 JButton trong class MyMainUI để thấy được sự khác biệt.

———————————————————————————————————————————————-

Dưới đây là Coding mẫu:

=========================================================================

class MyMainUI

=========================================================================

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class MyMainUI extends JFrame{

private static final long serialVersionUID = 1L;

public MyMainUI(String title)

{

setTitle(title);

}

public void doShow()

{

setSize(400,200);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

addControl();

setVisible(true);

}

public void addControl()

{

JPanel pnBox=new JPanel();

JButton btn1=new JButton(“Open MyUI1”);

JButton btn2=new JButton(“Open MyUI2”);

pnBox.add(btn1);

pnBox.add(btn2);

btn1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

MyUI1 ui1=new MyUI1(“Hello Teo!”);

ui1.setVisible(true);

}

});

btn2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

MyUI2 ui2=new MyUI2(“Hello Teo!”);

ui2.setModal(true);

ui2.setVisible(true);

}

});

Container con=getContentPane();

con.add(pnBox);

}

public static void main(String[] args) {

MyMainUI mainUI=new MyMainUI(“Demo OPen Another Windows”);

mainUI.doShow();

}

}

=========================================================================

class MyUI1

=========================================================================

import java.awt.Container;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class MyUI1 extends JFrame{

private static final long serialVersionUID = 1L;

public MyUI1(String title)

{

setTitle(“My JFrame”);

doAddSomeControl();

}

public void doAddSomeControl()

{

JPanel pn=new JPanel();

JButton btn1=new JButton(“Hello I’m JFrame”);

JTextField txt1=new JTextField(15);

pn.add(btn1);

pn.add(txt1);

Container con=getContentPane();

con.add(pn);

setSize(300, 200);

setLocationRelativeTo(null);

}

}

=========================================================================

class MyUI2

=========================================================================

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class MyUI2 extends JDialog{

private static final long serialVersionUID = 1L;

public MyUI2(String title)

{

setTitle(“My JDialog”);

doAddSomeControl();

}

public void doAddSomeControl()

{

JPanel pn=new JPanel();

JButton btn1=new JButton(“Hi ! My name is JDialog”);

JButton btn2=new JButton(“Click me!”);

JTextField txt1=new JTextField(15);

JLabel lbl1=new JLabel(“Hello! Hello!”);

pn.add(btn1);

pn.add(txt1);

pn.add(lbl1);

pn.add(btn2);

btn2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JOptionPane.showMessageDialog(null, “Click tui hả?”);

}

});

Container con=getContentPane();

con.add(pn);

setSize(300, 200);

setLocationRelativeTo(null);

}

}

Chúc các bạn thành công

Chương trình mẫu java: quản lý sản phẩm

Bài tập này mang tính tham khảo cho các sinh viên đang học Java1

Trong chương trình mẫu này Tôi muốn giới thiệu một số chức năng:

– Các control : JMenuBar, JSplitPane, JList, JTable, JCombobox

– Các collections: ArrayList, Vector

– JFileChooser

-Cho phép lưu đối tượng xuống ổ cứng và đọc đối tượng lên giao diện

Mô tả:

Cho phép nhập xuất danh sách các danh mục sản phẩm, các sản phẩm của từng danh mục, các chức năng thêm sửa xóa, lưu tập tin

Các em tham khảo và tiếp tục hoàn thiện những phần Thầy chưa làm.

Cũng như các ví dụ trước, Thầy không ghi chú, các em ráng đọc hiểu, vì cách sử dụng control Thầy đã hướng dẫn kỹ trên lớp

Cấu trúc file chương trình gồm có:

Product.java : dùng để lưu thông tin của từng sản phẩm

Category.java: dùng để lưu danh mục sản phẩm và lưu danh sách các sản phẩm của từng danh mục

ListCategory.java: dùng để lưu danh sách các danh mục

MyProcessFile.java: dùng để xử lý tập tin: lưu và đọc đối tượng trên ổ cứng

MainManagerUI.java: lớp giao diện chính của chương trình

CategoryManagerUI.java: lớp giao diện phụ để cập nhật thông tin của danh mục

TestMain.java: dùng để chạy chương trình chính

Giao diện chính của chương trình như sau:

Khi bấm vào nút New của danh mục sẽ hiển thị màn hình cập nhật danh mục:

Coding mẫu:

Product.java

importjava.io.Serializable;public class Product implements Serializable {

       private static final long serialVersionUID = 1L;

private String productId;

private String productName;

private String description;

private double unitPrice;

private int quantity;

public String getProductId() {

return productId;

}

public void setProductId(String productId) {

this.productId = productId;

}

public String getProductName() {

return productName;

}

public void setProductName(String productName) {

this.productName = productName;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public double getUnitPrice() {

return unitPrice;

}

public void setUnitPrice(double unitPrice) {

this.unitPrice = unitPrice;

}

public int getQuantity() {

return quantity;

}

public void setQuantity(int quantity) {

this.quantity = quantity;

}

public Product(String productId, String productName,

String description, double unitPrice, int quantity) {

super();

this.productId = productId;

this.productName = productName;

this.description = description;

this.unitPrice = unitPrice;

this.quantity = quantity;

}

public Product() {

super();

}

}

Category.java:

import java.io.Serializable;

import java.util.ArrayList;

public class Category implements Serializable {

private static final long serialVersionUID = 1L;

private String cateId;

private String cateName;

private ArrayList<Product>listPro=new ArrayList<Product>();

public String getCateId() {

return cateId;

}

public void setCateId(String cateId) {

this.cateId = cateId;

}

public String getCateName() {

return cateName;

}

public void setCateName(String cateName) {

this.cateName = cateName;

}

public Category(String cateId, String cateName) {

super();

this.cateId = cateId;

this.cateName = cateName;

}

public Category() {

super();

}

public Product findProductById(String id)

{

for(Product p: listPro)

if(p.getProductId().equalsIgnoreCase(id))

return p;

return null;

}

public boolean addProduct(Product p)

{

Product pFind=findProductById(p.getProductId());

if(pFind!=null)

{

System.err.println(“Duplicate product ID!”);

return false;

}

listPro.add(p);

return true;

}

public ArrayList<Product> getListPro() {

return listPro;

}

public void setListPro(ArrayList<Product> listPro) {

this.listPro = listPro;

}

public void removeProductById(String id)

{

Product pFind=findProductById(id);

if(pFind!=null)

listPro.remove(pFind);

}

public void removeProductByIndex(String index)

{

listPro.remove(index);

}

public int numberOfProduct()

{

return listPro.size();

}

public String toString() {

return this.cateName;

}

}

ListCategory.java:

import java.io.Serializable;

import java.util.ArrayList;

public class ListCategory implements Serializable {

private static final long serialVersionUID = 1L;

private ArrayList<Category>listCate=new  ArrayList<Category>();

public Category findCateById(String id)

{

for(Category cate: listCate)

{

if(cate.getCateId().equalsIgnoreCase(id))

return cate;

}

return null;

}

public void addCate(Category cate)

{

Category cateFind=  findCateById(cate.getCateId());

if(cateFind!=null)

cateFind=cate;

else

listCate.add(cate);

}

public void removeCateById(String id)

{

Category cateFind=  findCateById(id);

if(cateFind!=null)

listCate.remove(cateFind);

}

public ArrayList<Category>getList()

{

return listCate;

}

}

MyProcessFile.java:

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

public class MyProcessFile {

public static void saveData(Object list,String fileName)

{

try

{

FileOutputStream fOut=new FileOutputStream(fileName);

ObjectOutputStream oOut=new ObjectOutputStream(fOut);

oOut.writeObject(list);

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

public static Object openData(String fileName)

{

try

{

FileInputStream fIn=new FileInputStream(fileName);

ObjectInputStream oIn=new ObjectInputStream(fIn);

return oIn.readObject();

}

catch(Exception ex)

{

ex.printStackTrace();

}

return null;

}

}

MainManagerUI.java:

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.util.Vector;

import javax.swing.BorderFactory;

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JComboBox;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.JTable;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.border.TitledBorder;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;

import javax.swing.table.DefaultTableModel;

public class MainManagerUI extends JFrame {

private static final long serialVersionUID = 1L;

private static JList lstCate;

private JTable tblProduct;

private DefaultTableModel dtmProduct;

private JButton btnCateRemove,btnCateNew,btnCateUpdate,btnNew,btnSave,btnRemove;

private JTextField txtId,txtName,txtUnitprice,txtQuantity;

private JTextArea txtDescription;

private static JComboBox cboCateList;

JMenuBar menubar;

JMenu mnuFile;

JMenuItem mnuFileOpenDataFromDisk,mnuFileWritetodisk,mnuFileExit;

public static ListCategory listData;

public static Category selectedCate;

public MainManagerUI(String title)

{

super(title);

listData=new ListCategory();

}

public void doShow()

{

setDefaultCloseOperation(EXIT_ON_CLOSE);

setSize(800, 550);

addControl();

setLocationRelativeTo(null);

setVisible(true);

}

public void addMenu()

{

menubar=new JMenuBar();

mnuFile=new JMenu(“File”);

mnuFileWritetodisk=new JMenuItem(“Write Data to disk”);

mnuFileOpenDataFromDisk=new JMenuItem(“Open Data from disk”);

mnuFileExit =new JMenuItem(“Exit”);

menubar.add(mnuFile);

mnuFile.add(mnuFileWritetodisk);

mnuFile.add(mnuFileOpenDataFromDisk);

mnuFile.addSeparator();

mnuFile.add(mnuFileExit);

setJMenuBar(menubar);

}

public void addControl()

{

addMenu();

JPanel pnBorder=new JPanel();

pnBorder.setLayout(new BorderLayout());

JPanel pnNorth=new JPanel();

JLabel lblTitle=new JLabel(“Quản lý sản phẩm”);

Font ftTitle=new Font(“arial”, Font.BOLD, 32);

lblTitle.setFont(ftTitle);

lblTitle.setForeground(Color.BLUE);

pnNorth.add(lblTitle);

pnBorder.add(pnNorth,BorderLayout.NORTH);

JPanel pnListCate=new JPanel();

JPanel pnListProduct=new JPanel();

JSplitPane slitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pnListCate, pnListProduct);

pnBorder.add(slitPane,BorderLayout.CENTER);

pnListCate.setLayout(new BorderLayout());

lstCate=new JList();

TitledBorder cateborder=new TitledBorder(BorderFactory.createLineBorder(Color.RED), “Danh mục sản phẩm”);

lstCate.setBorder(cateborder);

pnListCate.setPreferredSize(new Dimension(300, 0));

pnListCate.add(lstCate,BorderLayout.CENTER);

JPanel pnListCateSouth=new JPanel();

btnCateNew =new JButton(“New”);

pnListCateSouth.add(btnCateNew);

btnCateUpdate =new JButton(“Update”);

pnListCateSouth.add(btnCateUpdate);

btnCateRemove =new JButton(“Remove”);

pnListCateSouth.add(btnCateRemove);

pnListCate.add(pnListCateSouth,BorderLayout.SOUTH);

pnListProduct.setLayout(new BorderLayout());

JPanel pnProductTitle=new JPanel();

JLabel lblProductTitle=new JLabel(“Thông tin chi tiết”);

pnProductTitle.add(lblProductTitle);

pnListProduct.add(pnProductTitle,BorderLayout.NORTH);

JPanel pnProductTable=new JPanel();

pnProductTable.setLayout(new BorderLayout());

pnListProduct.add(pnProductTable,BorderLayout.CENTER);

dtmProduct =new DefaultTableModel();

dtmProduct.addColumn(“Product ID”);

dtmProduct.addColumn(“Product Name”);

dtmProduct.addColumn(“UnitPrice”);

dtmProduct.addColumn(“Quantity”);

dtmProduct.addColumn(“Description”);

tblProduct=new JTable(dtmProduct);

JScrollPane sctblproduct=new JScrollPane(tblProduct );

pnProductTable.add(sctblproduct,BorderLayout.CENTER);

JPanel pnProductDetail=new JPanel();

pnListProduct.add(pnProductDetail,BorderLayout.SOUTH);

pnProductDetail.setLayout(new BoxLayout(pnProductDetail, BoxLayout.Y_AXIS ));

JPanel pnCateList=new JPanel();

JLabel lblCateId=new JLabel(“Category :”);

cboCateList=new JComboBox();

pnCateList.add(lblCateId);

pnCateList.add(cboCateList);

pnProductDetail.add(pnCateList);

JPanel pnProductId=new JPanel();

JLabel lblProId=new JLabel(“Product ID:”);

txtId=new JTextField(20);

pnProductId.add(lblProId);

pnProductId.add(txtId);

pnProductDetail.add(pnProductId);

JPanel pnProductName=new JPanel();

JLabel lblProName=new JLabel(“Product Name:”);

txtName=new JTextField(20);

pnProductName.add(lblProName);

pnProductName.add(txtName);

pnProductDetail.add(pnProductName);

JPanel pnProductUnitPrice=new JPanel();

JLabel lblUnitPrice=new JLabel(“Unit Price:”);

txtUnitprice=new JTextField(20);

pnProductUnitPrice.add(lblUnitPrice);

pnProductUnitPrice.add(txtUnitprice);

pnProductDetail.add(pnProductUnitPrice);

JPanel pnProductQuantity=new JPanel();

JLabel lblQuantity=new JLabel(“Quantity:”);

txtQuantity=new JTextField(20);

pnProductQuantity.add(lblQuantity);

pnProductQuantity.add(txtQuantity);

pnProductDetail.add(pnProductQuantity);

JPanel pnProductDescription=new JPanel();

JLabel lblDescription=new JLabel(“Description:”);

txtDescription=new JTextArea(4, 20);

JScrollPane scare=new JScrollPane(txtDescription);

pnProductDescription.add(lblDescription);

pnProductDescription.add(scare);

pnProductDetail.add(pnProductDescription);

JPanel pnButton=new JPanel();

btnNew=new JButton(“New”);

btnSave=new JButton(“Save”);

btnRemove=new JButton(“Remove”);

pnButton.add(btnNew);

pnButton.add(btnSave);

pnButton.add(btnRemove);

pnProductDetail.add(pnButton);

cboCateList.setPreferredSize(txtId.getPreferredSize());

lblCateId.setPreferredSize(lblProName.getPreferredSize());

lblDescription.setPreferredSize(lblProName.getPreferredSize());

lblQuantity.setPreferredSize(lblProName.getPreferredSize());

lblUnitPrice.setPreferredSize(lblProName.getPreferredSize());

lblProId.setPreferredSize(lblProName.getPreferredSize());

Container con=getContentPane();

con.add(pnBorder);

btnCateNew.addActionListener(new processButtonEvent());

btnNew.addActionListener(new processButtonEvent());

btnSave.addActionListener(new processButtonEvent());

btnRemove.addActionListener(new processButtonEvent());

cboCateList.addActionListener(new processButtonEvent());

mnuFileWritetodisk.addActionListener(new processButtonEvent());

mnuFileOpenDataFromDisk.addActionListener(new processButtonEvent());

lstCate.addListSelectionListener(new ListSelectionListener() {

@Override

public void valueChanged(ListSelectionEvent arg0) {

selectedCate=(Category) lstCate.getSelectedValue();

showListProductIntoTable();

}

});

}

private void showListProductIntoTable()

{

dtmProduct.setRowCount(0);

for(Product p: selectedCate.getListPro())

{

Vector<String> vec=new Vector<String>();

vec.add(p.getProductId());

vec.add(p.getProductName());

vec.add(p.getUnitPrice()+””);

vec.add(p.getQuantity()+””);

vec.add(p.getDescription());

dtmProduct.addRow(vec);

}

}

public static void updateCateList()

{

lstCate.removeAll();

lstCate.setListData(listData.getList().toArray());

lstCate.updateUI();

cboCateList.removeAllItems();

for(Category cate : listData.getList())

{

cboCateList.addItem(cate);

}

}

private void doCreateNewCate()

{

CategoryManagerUI cateUI=new CategoryManagerUI(“Cate information”);

cateUI.doShow();

}

private void doSaveProduct()

{

if(selectedCate!=null)

{

Product p=new Product();

p.setProductId(txtId.getText());

p.setProductName(txtName.getText());

p.setQuantity(Integer.parseInt(txtQuantity.getText()));

p.setUnitPrice(Double.parseDouble(txtUnitprice.getText()));

p.setDescription(txtDescription.getText());

selectedCate.addProduct(p);

}

}

private void doComboboxSelected()

{

selectedCate=(Category) cboCateList.getSelectedItem();

}

private void doWriteDataToDisk()

{

JFileChooser fc=new JFileChooser(“.”);

if(fc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION)

{

MyProcessFile.saveData(listData, fc.getSelectedFile().getAbsolutePath());

}

}

private void doReadDataFromDisk()

{

JFileChooser fc=new JFileChooser(“.”);

if(fc.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)

{

listData=(ListCategory)      MyProcessFile.openData(fc.getSelectedFile().getAbsolutePath());

updateCateList();

}

}

private class processButtonEvent implements ActionListener

{

@Override

public void actionPerformed(ActionEvent e) {

Object o=e.getSource();

if(o.equals(btnCateNew))

{

doCreateNewCate();

}

else if(o.equals(btnNew))

{

txtDescription.setText(“”);

txtId.setText(“”);

txtName.setText(“”);

txtUnitprice.setText(“”);

txtQuantity.setText(“”);

txtId.requestFocus();

}

else if(o.equals(btnSave))

{

doSaveProduct();

}

else if(o.equals(cboCateList))

{

doComboboxSelected();

}

else if(o.equals(mnuFileWritetodisk))

{

doWriteDataToDisk();

}

else if(o.equals(mnuFileOpenDataFromDisk))

{

doReadDataFromDisk();

}

}

}

}

CategoryManagerUI.java:

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class CategoryManagerUI extends JFrame{

private static final long serialVersionUID = 1L;

private JTextField txtId,txtName;

private JButton btnOk;

public CategoryManagerUI(String title)

{

setTitle(title);

}

public void doShow()

{

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

setSize(300, 150);

addControl();

setLocationRelativeTo(null);

setAlwaysOnTop(true);

setVisible(true);

}

public void addControl()

{

JPanel pnBox=new JPanel();

pnBox.setLayout(new BoxLayout(pnBox, BoxLayout.Y_AXIS));

JPanel pnId=new JPanel();

txtId=new JTextField(15);

txtName=new JTextField(15);

JLabel lblId=new JLabel(“Cate Id:”);

JLabel lblName=new JLabel(“Cate Name:”);

pnId.add(lblId);

pnId.add(txtId);

pnBox.add(pnId);

JPanel pnName=new JPanel();

pnName.add(lblName);

pnName.add(txtName);

pnBox.add(pnName);

JPanel pnButton=new JPanel();

btnOk=new JButton(“OK”);

pnButton.add(btnOk);

pnBox.add(pnButton);

lblId.setPreferredSize(lblName.getPreferredSize());

Container con=getContentPane();

con.add(pnBox);

btnOk.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

Category cate=new Category(txtId.getText(), txtName.getText());

MainManagerUI.listData.addCate(cate);

MainManagerUI.updateCateList();

dispose();

}

});

}

}

TestMain.java:

 public class TestMain {

public static void main(String[] args) {

MainManagerUI uiProduct=new MainManagerUI(“Quản lý sản phẩm!”);

uiProduct.doShow();

}

}

Ví dụ giải phương trình bậc 2 – Java UI

Trong ví dụ này Tôi sẽ cung cấp 2 class.

Class 1 tên là PTB2UI dùng để thiết kế giao diện

class 2 tên là PTB2Engine dùng để giải phương trình bậc 2, có 3 thông số được truyền vào là a,b,c lấy từ giao diện

Ví dụ này có kiểm tra tính hợp lệ của dữ liệu nhập vào, các bạn xem các dòng lệnh try…catch

Tôi không có giải thích nhiều về code nữa, vì đã giải thích trong các bài giảng rồi, hi vọng các em cố gắng đọc hiểu. Có rất nhiều cách làm!

===========================================================================

class PTB2UI

===========================================================================

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.*;

public class PTB2UI extends JFrame {

private static final long serialVersionUID = 1L;

public PTB2UI(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(“Giải phương trình bậc 2”);

pnNorth.add(lblTitle);

pnBorder.add(pnNorth,BorderLayout.NORTH);

lblTitle.setForeground(Color.BLUE);

Font ft=new Font(“arial”, Font.BOLD, 25);

lblTitle.setFont(ft);

JPanel pnSouth=new JPanel();

JButton btnGiai=new JButton(“Giải”);

JButton btnXoa=new JButton(“Xóa”);

JButton btnThoat=new JButton(“Thoát”);

pnSouth.add(btnGiai);

pnSouth.add(btnXoa);

pnSouth.add(btnThoat);

pnBorder.add(pnSouth,BorderLayout.SOUTH);

pnSouth.setBackground(Color.LIGHT_GRAY);

Border  southborder

=BorderFactory.createLineBorder(Color.RED);

TitledBorder southTitleBorder=

new TitledBorder(southborder, “Chọn tác vụ”);

pnSouth.setBorder(southTitleBorder);

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 a – b- c:”);

pnCenter.setBorder(centerTitleBorder);

JPanel pna=new JPanel();

JLabel lbla=new JLabel(“nhập a:”);

final JTextField txta=new  JTextField(15);

pna.add(lbla);

pna.add(txta);

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();

JLabel lblc=new JLabel(“nhập c:”);

final JTextField txtc=new  JTextField(15);

pnc.add(lblc);

pnc.add(txtc);

pnCenter.add(pnc);

JPanel pnkq=new JPanel();

JLabel lblkq=new JLabel(“kết quả nè:”);

final JTextField txtkq=new  JTextField(15);

pnkq.add(lblkq);

pnkq.add(txtkq);

pnCenter.add(pnkq);

lbla.setPreferredSize(lblkq.getPreferredSize());

lblb.setPreferredSize(lblkq.getPreferredSize());

lblc.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);

}

});

btnXoa.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

txtb.setText(“”);

txtc.setText(“”);

txtkq.setText(“”);

txta.requestFocus();

}

});

btnGiai.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

String sa=txta.getText();

int a=0,b=0,c=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;

}

String sc=txtc.getText();

try

{

c=Integer.parseInt(sc);

}

catch(Exception ex)

{

JOptionPane.showMessageDialog(null, “Nhập sai định dạng!”);

txtc.selectAll();

txtc.requestFocus();

return;

}

String kq=””;

PTB2Engine engine=new PTB2Engine(a, b, c);

kq=engine.compute();

txtkq.setText(kq);

}

});

Container con=getContentPane();

con.add(pnBorder);

}

public static void main(String[] args) {

PTB2UI ui=new PTB2UI(“ptb2”);

ui.doShow();

}

}

 

===========================================================================

class PTB2Engine 

===========================================================================

public classPTB2Engine {private inta;private intb;private int c;

public PTB2Engine(int a,int b,int c)

{

this.a=a;

this.b=b;

this.c=c;

}

public String compute()

{

String kq=””;

if(this.a==0)

{

if(this.b==0)

{

if(this.c==0)

{

kq=”Vô số nghiệm”;

}

else

{

kq=”Vô nghiệm”;

}

}

else

{

kq=”Pt co 1 no x1=”+(-this.c/this.b);

}

}

else

{

double delta=this.b*this.b-4*this.a*this.c;

if(delta<0)

kq=”Vô nghiệm”;

else if(delta==0)

kq=”No kép x1=x2=”+(-this.b/(2*this.a));

else

{

kq=”x1 = “+((-this.b-Math.sqrt(delta))/(2*this.a));

kq+=”  x2 = “+((-this.b+Math.sqrt(delta))/(2*this.a));

}

}

return kq;

}

}

 

Slide bài giảng Thiết kế giao diện trong JAVA

Thông báo dành cho các sinh viên đang học Java

Thầy vừa upload lên mạng slide bài giảng GUI trong Java, yêu cầu các em sinh viên phải tải về xem qua trước lý thuyết cũng như cách thực hiện

Ứng với mỗi Control đều có ví dụ mẫu, các em phải cài đặt lại toàn bộ ví dụ mẫu.

Link Powerpoint:

http://www.mediafire.com/?jc25m6rakhxpjd8

Link PDF:

http://www.mediafire.com/?dxob4v2fblljbla

Thầy Thanh.

Cách tạo giao diện trong Java – phần 4 : CardLayout

Để tạo được giao diện trong Java, trước tiên các bạn phải biết được LayoutManager trong Java, nó giống như là bản vẽ kỹ thuật cho một ngôi nhà.

Có nhiều loại LayoutManager, chẳng hạn như:

  •  FlowLayout
  •  BoxLayout
  •  BorderLayout
  •  CardLayout
  •  GridBagLayout
  •  GridLayout
  •  GroupLayout
  •  SpringLayout

Trong phần 4 chúng ta sẽ học về CardLayout

======================================================================

CardLayout

======================================================================

CardLayout cho phép chia sẻ vị trí hiển thị của các control, tức là ứng với cùng 1 vị trí hiển thị đó thì ta có thể cho các control khác hiển thị tại những thời điểm khác nhau, mặc định control được add đầu tiên sẽ hiển thị

importjava.awt.*;import java.awt.event.*;

import javax.swing.*;

public class MyCardLayout extends JFrame{

private static final long serialVersionUID = 1L;

public MyCardLayout(String title)

{

super(title);

}

public void doShow()

{

setSize(400,300);

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 btnShowCard1=new JButton(“Show Card1”);

JButton btnShowCard2=new JButton(“Show Card2”);

pnNorth.add(btnShowCard1);

pnNorth.add(btnShowCard2);

pnBorder.add(pnNorth,BorderLayout.NORTH);

final JPanel pnCenter=new JPanel();

pnCenter.setLayout(new CardLayout());

pnCenter.setBackground(Color.LIGHT_GRAY);

final JPanel pnCard1=new JPanel();

pnCard1.setBackground(Color.LIGHT_GRAY);

pnCard1.add(new JButton(“Hello “));

pnCard1.add(new JButton(“I’m Card1”));

final JPanel pnCard2=new JPanel();

pnCard2.setBackground(Color.PINK);

pnCard2.add(new JButton(“Hi “));

pnCard2.add(new JCheckBox(“CardLayout”));

pnCard2.add(new JButton(“I’m Card2″));

pnCenter.add(pnCard1,”mycard1″);

pnCenter.add(pnCard2,”mycard2”);

pnBorder.add(pnCenter,BorderLayout.CENTER);

Container con=getContentPane();

con.add(pnBorder);

btnShowCard1.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

CardLayout cl=(CardLayout)pnCenter.getLayout();

cl.show(pnCenter, “mycard1”);

}

});

btnShowCard2.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

CardLayout cl=(CardLayout)pnCenter.getLayout();

cl.show(pnCenter, “mycard2”);

}

});

}

public static void main(String[] args) {

MyCardLayout card=new MyCardLayout(“Demo CardLayout”);

card.doShow();

}

}

pnCenter.setLayout(new CardLayout()); để thiết lập pnCenter có layout là CardLayout

pnCenter.add(pnCard1,”mycard1″); thêm pnCard1 vào pnCenter

pnCenter.add(pnCard2,”mycard2″); them pnCard2 vào pnCenter

Mặc định thì pnCard1 sẽ được hiển thị, mỗi một card Tôi đặt tên lần lượt là mycard1 mycard2, ta sẽ dựa vào 2 tên kiểu chuỗi này để hiển thị hay không hiển thị.

Các bạn nhìn vào sự kiện lệnh cho nút btnShowCard1 và btnShowCard2:

CardLayout cl=(CardLayout)pnCenter.getLayout(); hàm getLayout để lấy về Layout sau đó ta ép qua kiểu CardLayout

cl.show(pnCenter, “mycard2”); gọi phương thức show của  đối tượng CardLayout để hiển thị theo tên, ở đây ta muốn hiển thị card2 thì truyền tên mycard2 vào.

Tôi có capture hình ảnh cho 2 trường hợp này:

Mặc định các bạn sẽ thấy Card1 hiển thị như hình bên dưới:

Bây giờ bạn click chuột vào nút Show Card2 bạn sẽ nhận được hình như bên dưới:

Ngoài ra các bạn có thể dùng JTabbedPane để thay thế cho CardLayout, JTabbedPane có giao diện đẹp mắt và thân thiện với người sử dụng, đoạn code dưới đây Tôi sẽ minh họa cho JTabbedPane:

import java.awt.*;

import javax.swing.*;

public class MytabbedControl extends JFrame {

private static final long serialVersionUID = 1L;

public MytabbedControl(String title)

{

super(title);

}

public void doShow()

{

setSize(400,300);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

addControl();

setVisible(true);

}

public void addControl()

{

JTabbedPane myTabled=new JTabbedPane();

JPanel pnTab1=new JPanel();

pnTab1.setBackground(Color.BLUE);

pnTab1.add(new JButton(“Tabbed 1”));

JPanel pnTab2=new JPanel();

pnTab2.setBackground(Color.ORANGE);

pnTab2.add(new JButton(“Tabbed 2″));

myTabled.add(pnTab1,”Tab1″);

myTabled.add(pnTab2,”Tab2”);

Container con=getContentPane();

con.add(myTabled);

}

public static void main(String[] args) {

MytabbedControl ui=new MytabbedControl(“My Tabbled”);

ui.doShow();

}

}

JTabbedPane myTabled=new JTabbedPane(); khai báo đối tượng  JTabbedPane

myTabled.add(pnTab1,”Tab1″); thêm 1 tab mới với tên là Tab1

myTabled.add(pnTab2,”Tab2″); thêm 1 tab mới với tên là Tab2

Các bạn xem hình ảnh minh họa JTabbedPane bên dưới:


Click qua Tab2 bạn sẽ thấy:

Cách tạo giao diện trong Java – phần 3 : BorderLayout

Để tạo được giao diện trong Java, trước tiên các bạn phải biết được LayoutManager trong Java, nó giống như là bản vẽ kỹ thuật cho một ngôi nhà.

Có nhiều loại LayoutManager, chẳng hạn như:

  •  FlowLayout
  •  BoxLayout
  •  BorderLayout
  •  CardLayout
  •  GridBagLayout
  •  GridLayout
  •  GroupLayout
  •  SpringLayout

Trong phần 3 chúng ta sẽ học về BorderLayout

======================================================================

BorderLayout

======================================================================

BorderLayout giúp chúng ta hiển thị các control theo 5 vùng chính theo hình dưới đây:

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.

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Container;

import java.awt.Dimension;

import java.awt.Font;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class MyBorderLayout extends JFrame

{

private static final long serialVersionUID = 1L;

public MyBorderLayout(String title)

{

setTitle(title);

}

public void doShow()

{

setSize(400,300);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

addControl();

setVisible(true);

}

public void addControl()

{

JPanel pnBorder=new JPanel();

pnBorder.setLayout(new BorderLayout());

Font ft=new Font(“Arial”, Font.BOLD|Font.ITALIC, 25);

JPanel pnNorth=new JPanel();

pnNorth.setBackground(Color.RED);

pnNorth.setPreferredSize(new Dimension(0, 50));

JLabel lblTitleNorth=new JLabel(“North”);

pnNorth.add(lblTitleNorth);

lblTitleNorth.setForeground(Color.WHITE);

lblTitleNorth.setFont(ft);

pnBorder.add(pnNorth,BorderLayout.NORTH);

JPanel pnSouth=new JPanel();

pnSouth.setBackground(Color.RED);

pnSouth.setPreferredSize(pnNorth.getPreferredSize());

JLabel lblTitleSouth=new JLabel(“South”);

pnSouth.add(lblTitleSouth);

lblTitleSouth.setForeground(Color.WHITE);

lblTitleSouth.setFont(ft);

pnBorder.add(pnSouth,BorderLayout.SOUTH);

JPanel pnWest=new JPanel();

pnWest.setBackground(Color.BLUE);

pnWest.setPreferredSize(new Dimension(70, 0));

JLabel lblTitleWest=new JLabel(“West”,JLabel.CENTER);

lblTitleWest.setFont(ft);

lblTitleWest.setForeground(Color.WHITE);

pnWest.setLayout(new BorderLayout());

pnWest.add(lblTitleWest,BorderLayout.CENTER);

pnBorder.add(pnWest,BorderLayout.WEST);

JPanel pnEast=new JPanel();

pnEast.setBackground(Color.BLUE);

pnEast.setPreferredSize(new Dimension(70, 0));

JLabel lblTitleEast=new JLabel(“East”,JLabel.CENTER);

lblTitleEast.setFont(ft);

lblTitleEast.setForeground(Color.WHITE);

pnEast.setLayout(new BorderLayout());

pnEast.add(lblTitleEast,BorderLayout.CENTER);

pnBorder.add(pnEast,BorderLayout.EAST);

JPanel pnCenter=new JPanel();

pnCenter.setBackground(Color.YELLOW);

pnCenter.setLayout(new BorderLayout());

JLabel lblTitleCenter=new JLabel(“Center”,JLabel.CENTER);

lblTitleCenter.setFont(ft);

pnCenter.add(lblTitleCenter,BorderLayout.CENTER);

pnBorder.add(pnCenter,BorderLayout.CENTER);

Container con=getContentPane();

con.add(pnBorder);

}

public static void main(String[] args) {

MyBorderLayout bor=new MyBorderLayout(“BorderLayout”);

bor.doShow();

}

}

Chúng ta có thể kết hợp FlowLayout , BoxLayout, BorderLayout để thiết kế giao diện, theo kinh nghiệm của Tôi thì chúng ta chỉ cần biết 3 Layout này là có thể thiết kế giao diện đẹp mắt được.

Cách tạo giao diện trong Java – phần 2 : BoxLayout

Để tạo được giao diện trong Java, trước tiên các bạn phải biết được LayoutManager trong Java, nó giống như là bản vẽ kỹ thuật cho một ngôi nhà.

Có nhiều loại LayoutManager, chẳng hạn như:

  •  FlowLayout
  •  BoxLayout
  •  BorderLayout
  •  CardLayout
  •  GridBagLayout
  •  GridLayout
  •  GroupLayout
  •  SpringLayout

Trong phần 2 chúng ta sẽ học về BoxLayout

======================================================================

BoxLayout : X_AXIS & Y_AXIS

======================================================================

BoxLayout cho phép add các control trên mỗi dòng hoặc mỗi 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, BoxLayout có 2 hằng số để xác định hướng xuất hiện của control: 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 khác biệt FlowLayout ở chỗ là nó 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ó.

importjava.awt.*;import javax.swing.*;

public class MyBoxLayout extends JFrame

{

private static final long serialVersionUID = 1L;

public MyBoxLayout(String title)

{

super(title);

}

public void doShow()

{

setSize(400,200);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

addControl(); //gọi hàm AddControl

setVisible(true);

}

public void addControl()

{

JPanel pnBox=new JPanel();

pnBox.setLayout(new BoxLayout(pnBox, BoxLayout.X_AXIS));

JButton btn1=new JButton(“BoxLayout”);

btn1.setForeground(Color.RED);

Font font=new Font(“Arial”,Font.BOLD | Font.ITALIC,25);

btn1.setFont(font);

pnBox.add(btn1);

JButton btn2=new JButton(“X_AXIS”);

btn2.setForeground(Color.BLUE);

btn2.setFont(font);

pnBox.add(btn2);

JButton btn3=new JButton(“Y_AXIS”);

btn3.setForeground(Color.ORANGE);

btn3.setFont(font);

pnBox.add(btn3);

Container con=getContentPane();

con.add(pnBox);

}

public static void main(String[] args) {

MyBoxLayout box=new MyBoxLayout(“Học BoxLayout”);

box.doShow();

}

}

pnBox.setLayout(new BoxLayout(pnBox, BoxLayout.X_AXIS)); dùng để thiết lập layout cho JPanel, ở đây ta thiết lập  BoxLayout.X_AXIS tức là các control xuất hiện theo chiều từ trái qua phải.

Font font=new Font(“Arial”,Font.BOLD | Font.ITALIC,25); tạo đối tượng font với Font chữ là Arial, vừa in đâm và in nghiêng và kích thước là 25px

btn1.setFont(font); thiết lập font chữ cho button btn1

btn2.setForeground(Color.BLUE); thiết lập màu chữ cho btn2

Như đã nói BoxLayout sẽ không tự động xuống dòng khi hết khoảng không gian chứa control, nên các bạn có thể thấy trong hình dưới đây khi Tôi thu hẹp kích thước cửa sổ lại:

Trong đoạn lệnh pnBox.setLayout(new BoxLayout(pnBox, BoxLayout.X_AXIS)); nếu như bạn đổi BoxLayout.X_AXIS thành BoxLayout.Y_AXIS thì các control sẽ được hiển thị như sau:

Cách tạo giao diện trong Java – phần 1 : FlowLayout

Để tạo được giao diện trong Java, trước tiên các bạn phải biết được LayoutManager trong Java, nó giống như là bản vẽ kỹ thuật cho một ngôi nhà.

Có nhiều loại LayoutManager, chẳng hạn như:

  •  FlowLayout  
  •  BoxLayout
  •  BorderLayout
  •  CardLayout
  •  GridBagLayout
  •  GridLayout
  •  GroupLayout
  •  SpringLayout

Trong phần 1 chúng ta sẽ học về FlowLayout

======================================================================

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. Bạn tưởng tượng rằng JPanel giống như cái thùng đựng đồ vật, từng đồ vật là các control ví dụ như trong thùng đựng đồ vật ta có thể đựng Sách, bút, giày, dép…Ta nên tạo JPanel để add các control vào JPanel để việc quản lý control được dễ dàng hơn.

Đoạn code dưới đây sẽ minh họa về FlowLayout, Tôi sẽ giải thích chi tiết từng dòng lệnh:

import java.awt.Color;import java.awt.Container;import java.awt.FlowLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class MyFlowLayout extends JFrame{

private static final long serialVersionUID = 1L;

public MyFlowLayout(String title)

{

setTitle(title);

JPanel pnFlow=new JPanel();

pnFlow.setLayout(new FlowLayout());

pnFlow.setBackground(Color.PINK);

JButton btn1=new JButton(“FlowLayout”);

JButton btn2=new JButton(“Add các control”);

JButton btn3=new JButton(“Trên 1 dòng”);

JButton btn4=new JButton(“Hết chỗ chứa”);

JButton btn5=new JButton(“Thì xuống dòng”);

pnFlow.add(btn1);

pnFlow.add(btn2);

pnFlow.add(btn3);

pnFlow.add(btn4);

pnFlow.add(btn5);

Container con=getContentPane();

con.add(pnFlow);

}

public static void main(String[] args)

{

MyFlowLayout myUI=new MyFlowLayout(“Demo FlowLayout”);

myUI.setSize(600, 100);

myUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

myUI.setLocationRelativeTo(null);

myUI.setVisible(true);

}

}

Khi chạy giao diện lên chúng ta sẽ thấy như hình bên dưới

Mặc định các control sẽ nằm trên cùng 1 dòng, nếu như không đủ chỗ chứa thì những control đó sẽ tự động rơi xuống dòng khác

Container con=getContentPane(); dùng để lấy lớp chứa của cửa sổ windows

con.add(pnFlow); dùng để add lớp chứa JPanel vào cửa sổ

Trong hàm main bạn để ý:

myUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thiết lập sự kiện đóng cửa sổ windows khi người sử dụng click chọn vào dấu “X” ở góc phải trên cùng cửa sổ

myUI.setLocationRelativeTo(null); thiết lập cửa sổ xuất hiện ở giữa màn hình desktop

myUI.setVisible(true); cho phép cửa sổ hiển thị ra.

– Nếu muốn gán sự kiện click chuột cho button 5 thì bạn có nhiều cách gán sự kiện, Tôi sẽ hướng dẫn 1 cách:

ngay bên dưới dòng lệnh JButton btn5=new JButton(“Thì xuống dòng”); bạn thêm vào lệnh sau:

btn5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null, “Button 5 được click!”);
}
});
Ở đây đơn giản Tôi hiển thị 1 messagebox thông báo là “Button 5 được click!”