Thứ Hai, 22 tháng 4, 2024

Swing

1. GUI

- GUI (Graphical User Interface) là một dạng giao diện người dùng cho phép người dùng tương tác với máy tính hoặc các thiết bị điện tử thông qua hình ảnh, biểu đồ, và chữ viết thay vì chỉ là các dòng lệnh.

- GUI tạo điều kiện cho người dùng tương tác một cách trực quan và dễ dàng hơn, giúp tăng cường trải nghiệm người dùng.

- Dưới đây là một số khái niệm cơ bản về GUI:

Thuật ngữMô tả
ComponentCác thành phần cơ bản được sử dụng để tạo giao diện người dùng như các nút, hộp văn bản, danh sách thả xuống, thanh cuộn, cửa sổ, v.v.
LayoutCách các thành phần GUI được sắp xếp trên màn hình. Layout quyết định vị trí và kích thước của mỗi thành phần, giúp tạo ra một giao diện người dùng hợp lý và dễ đọc.
Sự kiện (Event)Các hoạt động như nhấn nút, di chuyển chuột, nhập văn bản, v.v., mà người dùng thực hiện trong ứng dụng. Các sự kiện này kích hoạt các hành động cụ thể trong ứng dụng, như thay đổi dữ liệu hoặc chuyển đổi trạng thái

Trong Java, Swing là một bộ công cụ GUI (Graphical User Interface) được sử dụng để phát triển các ứng dụng desktop.

Một số phương thức hữu ích giúp tạo và quản lý giao diện người dùng đồ họa trong Java :

Phương thứcMô tả
add(Component c)Phương thức này được sử dụng để thêm một thành phần (component) vào cửa sổ (window) hoặc bảng điều khiển (container). Tham số c là đối tượng của lớp java.awt.Component hoặc một lớp con của nó, chẳng hạn như JButton, JLabel, JTextField, vv.
setSize(int width, int height)Phương thức này được sử dụng để thiết lập kích thước của cửa sổ hoặc bảng điều khiển. Tham số width là chiều rộng của cửa sổ, còn height là chiều cao của cửa sổ, tính bằng pixel.
setLayout(LayoutManagerm)Phương thức này được sử dụng để thiết lập bố cục (layout) của các thành phần bên trong cửa sổ hoặc bảng điều khiển. Tham số m là một đối tượng của lớp java.awt.LayoutManager, hoặc một lớp con của nó, đại diện cho loại bố cục mà bạn muốn sử dụng, chẳng hạn như FlowLayout, BorderLayout, vv.
setVisible(boolean status)Phương thức này được sử dụng để hiển thị hoặc ẩn cửa sổ. Tham số status là một giá trị boolean. Nếu status là true, cửa sổ sẽ được hiển thị; nếu status là false, cửa sổ sẽ bị ẩn.

2. Swing

A. Component















Thành phầnMô tả
JFrameLà cửa sổ chính của ứng dụng, có thể chứa nhiều thành phần khác nhau như nút, hộp văn bản, v.v.
JPanelLà một container linh hoạt có thể chứa nhiều thành phần khác nhau. Panel thường được sử dụng để nhóm các thành phần hoặc tạo layout.
JButtonLà một nút có thể được nhấn bởi người dùng để thực hiện một hành động cụ thể.
JLabelLà một vùng hiển thị văn bản hoặc hình ảnh không thể chỉnh sửa bởi người dùng, thường được sử dụng để hiển thị nhãn cho các thành phần khác.
JTextFieldLà một hộp văn bản mà người dùng có thể nhập dữ liệu.
JTextAreaTương tự như JTextField, nhưng cho phép nhập văn bản dài hơn và có thể cuộn.
JComboBoxLà một danh sách thả xuống cho phép người dùng chọn một trong các tùy chọn.
JCheckBoxLà một ô kiểm (checkbox) cho phép người dùng chọn hoặc bỏ chọn một tùy chọn cụ thể.
JRadioButtonLà một nút radio cho phép người dùng chọn một trong các tùy chọn duy nhất trong một nhóm các tùy chọn.
JScrollPaneLà một thanh cuộn được sử dụng để hiển thị nội dung khi không đủ không gian.
JFileChooserLà một hộp thoại cho phép người dùng chọn tệp hoặc thư mục từ hệ thống tệp.
JSliderLà một thanh trượt cho phép người dùng chọn một giá trị từ một phạm vi.
JProgressBarLà một thanh tiến trình hiển thị tiến độ của một tác vụ.
JMenu và JMenuItemLà các thành phần để tạo menu và các mục trong menu.
JTabbedPaneLà một thanh tab cho phép người dùng chuyển đổi giữa các panel khác nhau.

B. Layout

LayoutMô tả
Swing------------BoxLayoutSắp xếp các thành phần theo chiều ngang hoặc dọc một cách linh hoạt. Tự động điều chỉnh kích thước của các thành phần.
BorderLayoutSắp xếp các thành phần thành các vùng phía bắc, phía nam, phía đông, phía tây và trung tâm. Mỗi vùng có thể chứa một thành phần duy nhất.
CardLayoutHiển thị một thành phần trong một thời điểm và cho phép chuyển đổi giữa các thành phần khác nhau. Thường được sử dụng để tạo các giao diện có nhiều trạng thái.
FlowLayoutSắp xếp các thành phần theo chiều ngang hoặc dọc, tự động chuyển sang dòng mới khi không đủ không gian. Phù hợp cho việc sắp xếp các thành phần theo dòng hoặc theo cột.
GridLayoutSắp xếp các thành phần trong một lưới dạng hàng và cột. Các ô trong lưới có kích thước bằng nhau.
GridBagLayoutCho phép bạn sắp xếp các thành phần theo cách tự do, linh hoạt, và điều chỉnh các thuộc tính kích thước của các thành phần. Phù hợp cho việc tạo các giao diện phức tạp.
GroupLayoutCho phép bạn tạo các giao diện phức tạp bằng cách sử dụng các nhóm và các lề. Thường được sử dụng trong việc thiết kế giao diện trong IDE như NetBeans.
SpringLayoutCho phép bạn định vị các thành phần dựa trên các ràng buộc spring (còn được gọi là spring constraint). Cung cấp kiểm soát linh hoạt về vị trí và kích thước của các thành phần.


1. Boxlayout


2. Borderlayout


3. Cardlayout


4. Flowlayout


5. Gridlayout


6. GridBaglayout


7. Grouplayout


8. Springlayout



C. Event

Trong Java, sự kiện (Event) đóng vai trò quan trọng trong việc xử lý tương tác giữa người dùng và ứng dụng. Sự kiện xảy ra khi trạng thái hoặc điều kiện của một đối tượng thay đổi, và ứng dụng cần phản ứng hoặc xử lý hành động tương ứng. Dưới đây là một số khái niệm cơ bản về sự kiện trong Java:

1: Khái niệm cơ bản về sự kiện

STTKhái niệmMô tả
1Sự kiện (Event)Là một hành động nào đó xảy ra trong hệ thống, chẳng hạn như bấm chuột, nhấn phím, hoặc thao tác với giao diện người dùng.
2Người nghe sự kiện (Event Listener)Là một đối tượng có khả năng lắng nghe và xử lý các sự kiện. Trong Java, một người nghe sự kiện được triển khai bằng cách triển khai một interface tương ứng.
3Người phát sự kiện (Event Source)Là đối tượng tạo ra sự kiện. Trong Java, các thành phần của giao diện người dùng như JButton, JList, JTextField, v.v. thường là người phát sự kiện.
4Bộ xử lý sự kiện (Event Handler)Là phần mã được thực thi khi một sự kiện được kích hoạt. Nó thường được triển khai trong phương thức của người nghe sự kiện.
5Loại sự kiện (Event Type)Là loại cụ thể của sự kiện, chẳng hạn như ActionEvent (được kích hoạt khi một hành động được thực hiện trên một thành phần), MouseEvent (được kích hoạt khi có tương tác chuột), KeyEvent (được kích hoạt khi có sự kiện phím nhấn), v.v.

2: Xử lý sự kiện trong Java

STTCác bướcMô tả
1 Tạo Trong Java, mỗi loại sự kiện thường có một interface tương ứng để lắng nghe và xử lý sự kiện đó. Đầu tiên, bạn cần tạo một lớp hoặc một đối tượng thực hiện giao diện người nghe sự kiện tương ứng. Ví dụ, để lắng nghe sự kiện khi một JButton được nhấn, bạn cần triển khai ActionListener.
2Đăng ký Để một đối tượng có thể lắng nghe sự kiện từ một nguồn phát sự kiện, nó cần đăng ký với nguồn sự kiện bằng cách sử dụng phương thức addXXXListener(). Ví dụ, nếu bạn muốn lắng nghe sự kiện của một JButton, bạn cần sử dụng phương thức addActionListener() để đăng ký người nghe sự kiện với JButton đó.
3Xử lý Cuối cùng, bạn cần viết nội dung xử lý bên trong phương thức của người nghe sự kiện mà bạn đã tạo. Phương thức này sẽ được gọi khi sự kiện xảy ra và chứa mã để xử lý sự kiện đó.


🔧 Hiểu đơn giản:

  • Nút (JButton) = Một cái nút ngoài đời.

  • Lời nhắn (actionPerformed) = Việc bạn muốn làm khi bấm nút, ví dụ: in ra, hiển thị thông báo, tính toán...

  • addActionListener(...) = Sợi dây nối nút với lời nhắn → Khi bấm nút thì lời nhắn sẽ tự động được gọi.

🔧 Phần mở rộng :


🔹 1. ActionListener là gì?

ActionListenermột interface trong Java (được định nghĩa sẵn bởi Java Swing) dùng để xử lý các sự kiện hành động – như bấm nút, chọn menu, v.v.

Nó có đúng 1 hàm duy nhất:

Tức là: nếu bạn muốn xử lý khi người dùng bấm nút, bạn phải viết một hàm actionPerformed().


🔹 2. Tại sao phải ghi đè actionPerformed()?

ActionListener là một interface, nên khi bạn tạo một đối tượng từ new ActionListener(), bạn bắt buộc phải override (ghi đè) hàm actionPerformed().

Ví dụ:

Đây gọi là anonymous inner class: bạn không cần tạo class riêng, mà viết luôn lớp xử lý trong new ActionListener().


🔹 3. Lambda thay thế thế nào?

ActionListener chỉ có 1 phương thức (actionPerformed), nó là functional interface ⇒ bạn có thể dùng cú pháp lambda cho gọn hơn.

Tương đương:

e chính là ActionEvent trong actionPerformed(ActionEvent e).

3. Interface EventListener

Interface EventListener trong Java là một giao diện (interface) được sử dụng để lắng nghe (listen) và xử lý các sự kiện (events). Interface này là một phần quan trọng của mô hình lập trình sự kiện trong Java, giúp cho việc xử lý sự kiện trở nên linh hoạt và dễ dàng hơn.

EventListener không có bất kỳ phương thức cụ thể nào, thay vào đó, nó chỉ đơn giản là một đánh dấu cho các lớp khác để implement (thực thi) và lắng nghe các sự kiện. Các lớp con của EventListener được thiết kế để lắng nghe cho một loại cụ thể của sự kiện, và sau đó thực thi các hành động tương ứng khi sự kiện đó xảy ra.

Một số interface con phổ biến của Event Listener Interface :

Interface Phương thức Giải thích
ActionListenervoid actionPerformed(ActionEvent e)Được gọi khi một hành động được thực hiện trên một thành phần, chẳng hạn như khi một JButton được nhấn hoặc một JMenuItem được chọn.
ComponentListenervoid componentResized(ComponentEvent e) void componentMoved(ComponentEvent e) void componentShown(ComponentEvent e) void componentHidden(ComponentEvent e)Sử dụng để lắng nghe các sự kiện thay đổi trong kích thước, vị trí hoặc sự hiển thị của một thành phần, như khi cửa sổ được thay đổi kích thước, di chuyển hoặc được ẩn.
ItemListenervoid itemStateChanged(ItemEvent e)Được gọi khi trạng thái của một thành phần như JCheckbox hoặc JRadioButton thay đổi.
KeyListenervoid keyPressed(KeyEvent e) void keyReleased(KeyEvent e) void keyTyped(KeyEvent e)Sử dụng để lắng nghe các sự kiện từ bàn phím, như khi một phím được nhấn, nhả ra hoặc được gõ.
MouseListenervoid mouseClicked(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e)Sử dụng để lắng nghe các sự kiện chuột, như khi chuột được nhấn, di chuyển vào hoặc ra khỏi một thành phần.
WindowListenervoid windowOpened(WindowEvent e) void windowClosing(WindowEvent e) void windowClosed(WindowEvent e) void windowIconified(WindowEvent e) void windowDeiconified(WindowEvent e) void windowActivated(WindowEvent e) void windowDeactivated(WindowEvent e)Sử dụng để lắng nghe các sự kiện liên quan đến cửa sổ, như khi cửa sổ được mở, đóng, thu nhỏ, phục hồi hoặc kích hoạt.
AdjustmentListenervoid adjustmentValueChanged(AdjustmentEvent e)Được gọi khi người dùng thay đổi giá trị của thanh cuộn.
ContainerListenervoid componentAdded(ContainerEvent e) void componentRemoved(ContainerEvent e)Sử dụng để lắng nghe các sự kiện thêm hoặc xóa thành phần từ một container, như khi một thành phần được thêm vào hoặc loại bỏ khỏi container.
MouseMotionListenervoid mouseDragged(MouseEvent e) void mouseMoved(MouseEvent e)Sử dụng để lắng nghe các sự kiện di chuyển chuột, như khi chuột được di chuyển qua một thành phần hoặc được kéo thả.
FocusListenervoid focusGained(FocusEvent e) void focusLost(FocusEvent e)Được gọi khi một thành phần nhận hoặc mất trạng thái focus.
4. Event Adapter

- Event Adapter là một lớp trung gian cung cấp một triển khai mặc định cho một hoặc nhiều phương thức của một giao diện lắng nghe sự kiện (event listener interface).

- Giúp rút ngắn mã lệnh và làm cho mã của bạn dễ đọc hơn bằng cách loại bỏ việc cài đặt (implement) tất cả các phương thức trong một giao diện lắng nghe sự kiện, ngay cả khi bạn chỉ quan tâm đến một số ít trong số đó.


Interface  Adapter Class Mô tả
MouseListenerMouseAdapter Dùng để xử lý các sự kiện chuột như click, press, release, enter, exit. Adapter giúp bạn chỉ cần override các phương thức bạn quan tâm.
MouseMotionListenerMouseMotionAdapterDùng để xử lý sự kiện di chuyển chuột (mouseMoved,  mouseDragged).
KeyListener  KeyAdapterDùng để xử lý các phím bấm từ bàn phím (keyPressed, keyReleased, keyTyped).
FocusListenerFocusAdapterXử lý sự kiện khi một thành phần được focus hoặc mất focus.
WindowListenerWindowAdapterXử lý sự kiện cửa sổ như đóng, mở, thu nhỏ, phóng to (windowClosing, windowOpened, v.v.).

Ví dụ :

📌 Tóm lại:

  • ✔ Adapter dùng khi interface có nhiều phương thức.

  • ➕ Dùng Adapter giúp code gọn hơn, không phải override tất cả.

  • ❌ Không có ActionListenerAdapter vì ActionListener chỉ có 1 phương thức thôi, không cần adapter, chỉ cần viết trực tiếp hoặc dùng lambda:





Không có nhận xét nào:

Đăng nhận xét