JFrame một trong những thứ bạn phải biết đầu tiên trong Java Swing

JFrame là một container(Nơi chứa và sắp xếp các component khác của Java Swing, có thể là các container khác) trong ứng dụng Java Swing, nó được dùng để chứa và sắp xếp các phần con như Button, Label, TextField, etc. Có thể đây là nơi bắt đầu của mọi ứng dụng Swing, nên JFrame là mục đầu tiên mà chúng ta cần tìm hiểu trước khi học đến các component khác trong Swing.

Tạo một JFrame trong Swing

Trong đoạn mã sau, chúng ta sẽ sử dụng constructor chứa một tham số đầu vào là tiêu đề của JFrame.

JFrame  frame  = new JFrame("Swing");

Mặc định khi một JFrame được khởi tạo xong nó sẽ ở trạng thái ẩn, tất là người dùng sẽ không thấy được. Nếu muốn hiển thị JFrame này đến người dùng chúng ta cần gọi đến setVisible(boolean visible) với giá trị truyền vào:

  • True – JFrame sẽ hiện thị ra giao diện.
  • False – JFrame sẽ bị ẩn đi.

Như vậy chúng ta có đoạn mã đầy đủ sau giúp tạo một JFrame với chiều dài là 300 và chiều cao là 100, và hiển thị nó lên màn hình Desktop

import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        // Create a frame
        JFrame frame = new JFrame("JFrame");
        frame.setSize(300, 100);
        // Display the frame
        frame.setVisible(true);
    }
}

 Xử lý khi JFrame bị đóng

Khi một JFrame được khởi tạo, cho đến khi người dùng tắt JFrame này thì chúng ta có thể định nghĩa các hành động tương ứng mà chúng ta muốn trong giai đoạn này. Java Swing cung cấp 4 hằng số tương ứng với 4 loại hành động sau khi một JFrame bị đóng. Các hằng số này được định nghĩa trong trong avax.swing.WindowsConstants:

  • DO_NOTHING_ON_CLOSE– Không làm thêm bất cứ điều gì khi JFrame bị đóng
  • HIDE_ON_CLOSE – JFrame sẽ bị ẩn đi khi người dùng đóng nó lại. Chương trình vẫn sẽ hoạt động bình thường trong khi JFrame này bị ẩn. Đây là một hành động mặc định của JFrame.
  • DISPOSE_ON_CLOSE – Sau khi bị đóng lại, nó đồng thời sẽ bị dọn dẹp rác, các tài nguyên được JFrame này sử dụng sẽ bị thu hồi nhường chỗ cho những nơi khác sử dụng.
  • EXIT_ON_CLOSE – Sau khi JFrame bị đóng, chương trình cũng sẽ tắt theo.

Chúng ta có thể đặt hành vi đóng mặc định của JFrame bằng cách chuyển một trong bốn hằng số vào phương thức setDefaultCloseOperation () của nó

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Chiều cao, rộng và vị trí của JFrame trên màn hình Desktop

Mặc định khi JFrame được khởi tạo thì vị trí xuất hiện của nó trên mành hình Desktop nằm ở phía trên bên trái cùng của màn hình. Kích thước tuỳ thuộc vào các component chứa trong nó.

Để thay đổi kích thước và vị trí mặc định của JFrame, chúng ta có thể sử dụng:

  • setSize(width, height) – Chỉ định chiều rộng vào chiều cao của JFrame
  • setLocation(int x, int y) – Chỉ định toạ độ của JFrame trên màn hình theo 2 trục X, Y
  • setBounds(int x, int y, int width, int height) – Cách sử dụng nhanh, gộp 2 hàm ở trên lại thành 1.
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        // Create a frame
        JFrame frame = new JFrame("JFrame");
        frame.setSize(300, 100);
        frame.setLocation(300,400);
        // Display the frame
        frame.setVisible(true);
    }
}

Cài đặt LayoutManager cho JFrame

JFrame là một container dùng để chứa và sắp xếp các component con bên trong chúng, điều này hiển nhiên chúng ta có thể gán cho nó một Layout giúp phân bổ các thành con hiệu quả hơn.

Chúng ta có thể gán một Layout cho JFrame với setLayout() method. Ví dụ mình gán GridBagLayout cho JFrame của mình như sau:

frame.setLayout(new GridBagLayout())

Thêm các component con vào JFrame

Việc một container phải chứa các control là điều hiển nhiên và cần thiết để tạo nên một giao diện ứng dụng cho người dùng. Để thêm các các component con vào JFrame trước tiên chúng ta cần lấy một đối tượng Container đại diện cho cùng chứa của JFrame

JFrame  frame  = new JFrame("Test");

// Get the reference of  the   content  pane
Container contentPane = frame.getContentPane();

Từ Container này chúng ta có thể thêm các component con vào JFrame thông qua add() method.

import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame("JFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = frame.getContentPane();

        // Add a close button
        JButton closeButton = new JButton("Close");
        contentPane.add(closeButton);

        // set the size of the frame 300 x 200
        frame.setBounds(50, 50, 300, 200);
        frame.setVisible(true);
    }
}

Cấu hình kích thước của JFrame

Giả sử chúng ta muốn kích thước của JFrame lớn bằng màn hình desktop, hay chiều rộng bằng với chiều rộng của màn hình Desktop thì chúng ta sẽ làm như thế nào nhỉ? Thông thường thì JFrame chỉ hiện thị chiều cao và chiều rộng sao cho đủ chứa các component con bên trong nó. Tuy nhiên JFrame cũng hỗ trợ một số tuỳ chọn khác:

  • NORMAL – Hiển thị kích thước thông thường
  • ICONIFIED – Hiển thị kích thước thu nhỏ
  • MAXIMIZED_HORIZ – Hiển thi với kích chiều rộng đạt kích thước tối đa
  • MAXIMIZED_VERT – Hiển thi với kích chiều cao đạt kích thước tối đa
  • MAXIMIZED_BOTH – Hiển thị với kích thước chiều cao và chiều rộng đạt kích thước tối đa

Để sử dụng các tuỳ chọn trên chúng ta cần sử dụng setExtendedState() method với các tuỳ chọn tương ứng.

import javax.swing.JFrame;

public class Main {
    public static void main(String[] args)  {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);

    }
}

Canh JFrame ở giữa màn hình

Mặc định thì JFrame sẽ hiện thị ở góc trên trái màn hình deskptop, nếu các bạn muốn nó xuất hiện ở giữa màn hình thì có thể làm cách đơn giản bằng cách sử dụng setLocationRelativeTo() method.

import javax.swing.*;

public class JFrameExample {
    public static void main(String[] agrs) {
        JFrame mainFrame = new JFrame("JFrame Exampke");
        mainFrame.setSize(400, 150);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setVisible(true);

    }
}

Ngoài ra, trong awt package còn cung cấp cho chúng ta bộ công cụ có thể lấy chiều cao và chiều rộng của màn hình Desktop, từ đó chúng ta có thể tính toán chính xác toạ độ của giữa màn hình.

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

public class JFrameExample {
    public static void main(String[] agrs) {
        JFrame mainFrame = new JFrame("JFrame Exampke");
        mainFrame.setSize(400, 150);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        mainFrame.setLocation(dim.width/2-mainFrame.getSize().width/2, dim.height/2-mainFrame.getSize().height/2);
        mainFrame.setVisible(true);

    }
}

Hoặc nếu bạn đang sử dụng giao diện kéo thả của Netbeans thì có thể chỉnh thông qua thuộc tính Generate Center ở Code tab.

Xử lý sự kiện trong JFrame

Chúng ta có thể thêm một trình lắng nghe nghe vào JFrame để nhận các thông báo những thay đổi trong trạng thái của chúng. 

Dưới đây là cách tạo và xử lý một số sự kiện cơ bản trong JFrame chẳng hạn như:

  • windowOpened – Lúc JFrame mới mở lên
  • windowClosed – JFrame bị đóng lại
  • vv.v
mport java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;

public class Main {
    public static void main(String[] args)  {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("JFrame has  been  made visible first  time");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("JFrame is closing.");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("JFrame is closed.");
            }

            @Override
            public void windowIconified(WindowEvent e) {
                System.out.println("JFrame is  minimized.");
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                System.out.println("JFrame is restored.");
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("JFrame is activated.");
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("JFrame is deactivated.");
            }
        });

        // Use the WindowAdapter class to intercept only the window closing event
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("JFrame is closing.");
            }
        });

        frame.setVisible(true);

    }
}

Nguồn tham khảo

http://www.java2s.com/Tutorials/Java/Java_Swing/0400__Java_Swing_JFrame.htm

https://stackoverflow.com/questions/2442599/how-to-set-jframe-to-appear-centered-regardless-of-monitor-resolution

 

 

Leave a Comment

Your email address will not be published. Required fields are marked *