Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

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

    GUI: Từ này chắc mình ko cần phải giải thích gì thêm nhỉ [IMG]images/smilies/biggrin.png[/IMG]. 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 [IMG]images/smilies/biggrin.png[/IMG]
    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 [IMG]images/smilies/biggrin.png[/IMG]. Trước tiên hãy đến với chương trình kinh điển "hello word"


    Mã:
    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 ();    }}



    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 [IMG]images/smilies/biggrin.png[/IMG])

    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 [IMG]images/smilies/biggrin.png[/IMG]. Có thể ví như mấy cái khung bán dép ngoài chợ ấy [IMG]images/smilies/biggrin.png[/IMG]. Còn những cái dép là những nhân vật chính [IMG]images/smilies/biggrin.png[/IMG]
    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 [IMG]images/smilies/biggrin.png[/IMG]. Bán hàng chẳng nhẽ là không có hàng [IMG]images/smilies/dont_know.gif[/IMG]---> 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)

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

    Mã:
    super ("My first program");
    : tên chương trình, cái mà bạn thấy phía trên cùng [IMG]images/smilies/biggrin.png[/IMG] cạnh dấu x

    add (label): Đính một cái gì đó lên frame thì ta dùng hàm add [IMG]images/smilies/biggrin.png[/IMG]


    Mã:
    //-----        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 [IMG]images/smilies/biggrin.png[/IMG]. 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 [IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG][IMG]images/smilies/laughing.gif[/IMG]
    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 [IMG]images/smilies/biggrin.png[/IMG]

    ----> Quan trọng nhất là bạn phải nhớ một farme bao giờ cũng có mấy cái kia [IMG]images/smilies/biggrin.png[/IMG]
    bạn có thể theo dõi thêm ví dụ sau


    Mã:
    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);    }    }


    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 [IMG]images/smilies/biggrin.png[/IMG]

    continue ..... !!!!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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

    Mã:
    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

    Mã:
     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();            }        });    }}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Anh RR nói chuẩn luôn [IMG]images/smilies/biggrin.png[/IMG]
    Ngoài ra bạn có thể khởi tạo cái JFrame như sau

    Mã:
    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)

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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,

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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..

  6. #6
    Ngày tham gia
    Sep 2015
    Đang ở
    24 Rạch Bùng Binh , P10,Q3 , HCM
    Bài viết
    0
    Trích dẫn Gửi bởi northlight
    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 [IMG]images/smilies/wave.gif[/IMG]

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Bạn viết cái gì mà icon tùm lum mình đọc muốn hoa cả mắt

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •