PDA

View Full Version : Hướng dẫn lập trình GUI trong Java Swing



Mr_Chan
15-03-2012, 09:01 PM
GUI: Từ này chắc mình ko cần phải giải thích gì thêm nhỉ :D. Chắc ai cũng đã rõ nó là cái giúp ta giao tiếp với chương trình, ... tốt hơn :D
Demo một chương trình cho dễ hình dung. Rồi ta mới bắt tay vào từng cái một :D. Trước tiên hãy đến với chương trình kinh điển "hello word"



import javax.swing.*;
import java.awt.*;

public class first extends JFrame
{
private JLabel label;

public first ()
{
super ("My first program");

//-----
setVisible (true);
setSize (200, 70);
setDefaultCloseOperation (EXIT_ON_CLOSE);
setLayout (new FlowLayout ());
//-----

label = new JLabel ("Hello World, hello every body");
add (label);
}

public static void main (String args [])
{
first gui = new first ();
}
}

8843


Bài này mình hướng dẫn code label, textfield, buttom ..... theo kiểu swing. (nên một số bạn ko nên thắc mắc là sao ko dùng awt nhé. Giải thích: Vì bây giờ swing hỗ trợi nhiều hơn, tiện hơn, .... tuy nhiên những cái đề cập tới thì ko hơn awt lắm :D)

1> Thư viện
- import javax.swing.*;
trong swing chưa các lớp đối tượng JFrame, Jlabel, ...... Những thứ mà hiện lên nút bấm, đoạn gõ text.... mà ta thấy
- import java.awt.*; Thư viện chứa các lớp đối tượng căn chỉnh ....;
mấy bài tới sẽ đề cập tới
- import java.awt.event.*; ---> Quản lý sự kiện

2> GUI
là những thứ mình nhìn thấy, giao tiếp với chương trình. Một gui bao gồm có khung frame (hoặc có thêm panel). frame hay panel thực chất là một cái khung to tướng để ta đính các đối tượng bắt sự kiện lên trên :D. Có thể ví như mấy cái khung bán dép ngoài chợ ấy :D. Còn những cái dép là những nhân vật chính :D
Tuy là vậy nhưng nhân vật phụ lúc nào cũng phải có, nhân vật chính thì có người nọ người kia -----> Nhất thiết, bắt buộc phải tạo một khung frame khi nói tới gui
Đương nhiên có khung rồi. chả có nhẽ lại để nó trơ trọi một mình :D. Bán hàng chẳng nhẽ là không có hàng (:-)??---> phải có thêm các label, buttom ....

3> Mổ xẻ một chương trình đơn giản (tức là chương trình trên)


private JLabel label;

Một cái nhãn bình thường mà ta đính lên JFrame thôi bạn ah.

super ("My first program");: tên chương trình, cái mà bạn thấy phía trên cùng :D cạnh dấu x

add (label): Đính một cái gì đó lên frame thì ta dùng hàm add :D



//-----
setVisible (true);
setSize (200, 70);
setDefaultCloseOperation (EXIT_ON_CLOSE);
setLayout (new FlowLayout ());
//-----

Cái này là 4 thuộc tính quan trọng của 1 farme. riêng setDefaultCloseOperation (EXIT_ON_CLOSE); ở bên awt ko hỗ trợ. do đó ta phải tự thiết kế lấy để dùng :D. Nhiệm vụ của nó kết thúc chương trình sau khi ấn dấu x. Bạn thử bỏ dòng này rồi dịch + chạy thử sẽ rõ. Chương trình vẫn run khi nó đã xxxx mấy lần rồi (:))(:))(:))(:))(:))
setVisible (true); // có nghĩa là cho hiện ra để ta thấy
setSize (200, 70): chiều dài là 200 còn chiều rộng là 70
setLayout (new FlowLayout ()); Trang trí tự động trên frame. có mấy loại cơ nhưng loại FlowLayout là phổ biến nhất, đẹp nhất rồi :D

----> Quan trọng nhất là bạn phải nhớ một farme bao giờ cũng có mấy cái kia :D
bạn có thể theo dõi thêm ví dụ sau



import javax.swing.*;
import java.awt.*;
public class FirstGui extends JFrame
{
private JLabel label;
private JButton button;
private JTextField textfield;

public FirstGui ()
{
//-----
label = new JLabel ("Hi, Tao la label ne hehe");
add (label);

textfield = new JTextField (15);
add (textfield);

button = new JButton ("Click vao tao ne !!!");
add (button);
}

public static void main (String args [])
{
FirstGui gui = new FirstGui ();
gui.setLayout (new FlowLayout ());
gui.setVisible (true);
gui.setSize (200, 125);
gui.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}

}

8844

chú ý chỗ mình bôi đen nhé. 4 cái thuộc tính ko để hàm tạo thì vẫn để trong main đc. Mình thì ko thích để trong main lắm :D

continue ..... !!!!

rox_rook
24-03-2012, 05:21 AM
Theo mình nghĩ, khi viết UI với Swing, bạn nên tránh gọi trực tiếp từ main(). Hàm main() có nhiệm vụ riêng của nó. Hơn nữa, bạn không nên build UI từ main thread, vì bản chất của Swing là event-driven, vì vậy nó sẽ chạy trên event-dispatching thread. Và thằng handler của nó tất nhiên cũng sẽ chạy trên event-dispatching thread chứ không phải main thread của chương trình. Một điều nữa, thằng JFrame là top-level container vì vậy bạn phải add UI components vào JPanel của nó, chứ không phải JFrame.
Ví dụ:
FirstUI.java


import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class FirstGUI extends JFrame {
private JLabel mLabel;
private JButton mButton;
private JTextField mTextField;

/**
* Constructor
**/
public FirstGUI() {
mLabel = new JLabel("Hello");
mTextField = new JTextField(15);
mButton = new JButton("Click");
getContentPane().add(mLabel);
getContentPane().add(mTextField);
getContentPane().add(mButton);
}

/**
* Build UI
**/
public static void buildGUI() {
FirstGUI app = new FirstGUI();
app.setLayout(new FlowLayout());
app.setSize(200, 125);
app.setVisible(true);
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
}
}


Program.java



import javax.swing.SwingUtilities;


public class Program {
public static void main(String args[]) {
// run on event-dispatching thread
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
FirstGUI.buildGUI();
}
});
}
}

Wazi Armstrong
24-03-2012, 07:20 AM
Anh RR nói chuẩn luôn :D
Ngoài ra bạn có thể khởi tạo cái JFrame như sau

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thực chất 2 cách này là 1 (SwingUtilities gọi đến EventQueue rồi nhét cái runnable này vào Event Dispatching Thread)

beautifulsoul84hung
24-03-2012, 10:59 PM
Cám ơn mọi người đã góp ý. Tuy nhiên tutorial em viết cho người chưa từng lập trình về GUI. Do đó em viết một cách đơn giản nhất, từng bước nhất để người đọc có thể nắm bắt được một số khái niệm. Tránh gây mơ hồ, khó hiểu dẫn tới nhàm chán.
Tut đang trong quá trình hoàn thiện nên mong được mọi người góp ý nhiều hơn

Thanks for reading,
beautifulsoul84hung,

northlight
21-02-2013, 07:29 PM
mình mới vào học java..nói là học nhưng thầy mới giới thiệu về java thôi và thầy ra cho cái bài tập là viết ứng dụng nhỏ nhỏ như game luyện đánh chữ...cho mình hỏi là minh tạo 1 cái textfield rồi..làm sao để cho nó bắt cái xâu mình gõ vào để rồi in cái đó ra..ý là mình gõ bao nhiêu là nó ra bấy nhiêu ấy...rồi làm sao nó so sánh với cái mà máy tính đưa ra...mình hiểu cách làm nhưng khổ nổi không biết viết cái bắt sự kiện...hjhj..ai hiểu chỉ vài chiêu với..em xin cảm ơn..

Mr_Chan
27-02-2013, 01:11 AM
mình mới vào học java..nói là học nhưng thầy mới giới thiệu về java thôi và thầy ra cho cái bài tập là viết ứng dụng nhỏ nhỏ như game luyện đánh chữ...cho mình hỏi là minh tạo 1 cái textfield rồi..làm sao để cho nó bắt cái xâu mình gõ vào để rồi in cái đó ra..ý là mình gõ bao nhiêu là nó ra bấy nhiêu ấy...rồi làm sao nó so sánh với cái mà máy tính đưa ra...mình hiểu cách làm nhưng khổ nổi không biết viết cái bắt sự kiện...hjhj..ai hiểu chỉ vài chiêu với..em xin cảm ơn..

Mình gợi ý bạn cách làm

B1: Tạo 2 khung text (đương nhiên có tên biến là bien1, bien2)
B2: Tạo value cho bien1 (bằng hàm random + timer)
B3: lấy giá trị của bien2 so sánh với giá trị của bien1 vừa lấy

Chú ý: Con trỏ chuột ở khung text2. nơi ta gõ. Sau khi gõ thì giá trị đc lấy để so sánh + bị reset.
...
...
Bạn thử đi theo ý tưởng đó xem (:-)h

kimonovaterang
14-03-2013, 09:48 PM
Bạn viết cái gì mà icon tùm lum mình đọc muốn hoa cả mắt

thuanchinapro07
14-06-2013, 01:37 PM
Mời bạn tiếp tục ! Làm cái thread Từ cơ bản đến nâng cao -> với java Swing

geoninh
31-08-2013, 07:32 PM
thanh bác bài viết rất hay đối với những người mới học như mình ...thank bác rất nhiều