Hướng dẫn sử dụng JComboBox và tuỳ biến theo nhu cầu

JComboBox là một thành phần của Java Swing kế thừa từ JComponent class, nó cho phép hiển thị một popup menu gồm một danh sách các phần tử là các tuỳ chọn, người dùng có thể chọn một trong số những tuỳ chọn này. JComboBox có thể chỉnh sửa hoặc read-only tùy thuộc vào sự lựa chọn của lập trình viên.

Khởi tạo JComboBox

Để khởi tạo một JComboBox chúng ta có thể sử dụng một số constructor sau:

  • JComboBox() – Khởi tạo một JComboBox rỗng.
  • JComboBox(ComboBoxModel M) – Khởi tạo JComboBox với các phần tử được cung cấp bởi ComboBoxModel.
  • JComboBox(E [ ] arr) – Khởi tạo JComboBox với các phần tử từ mảng arr được chỉ định.
  • JComboBox(Vector items) – Khởi tạo JComboBox với các phần tử từ Vector items được chỉ định.

Một số method thường sử dụng trong JComboBox

JComboBox cung cấp rất nhiều method để chúng ta sử dụng, trong phần này chúng ta sẽ cùng điểm qua một số method thường sử dụng nhất:

  • addItem(E item) – Thêm một phần tử vào JComboBox.
  • addItemListener( ItemListener l) – Thêm ItemListener vào JComboBox.
  • getItemAt(int i) – Trả về phần tử tạo vị trí i trong JCombobox.
  • getItemCount() – Trả về số lượng phần tử trong JComboBox.
  • getSelectedItem() – Trả về phần tử đang được người dùng lựa chọn.
  • removeItemAt(int i) – Xoá phần tại vị trí i được chỉ định.
  • removeItem(Object item) – Xoá item ra khởi JCombobox.
  • removeAllItems() – Xoá tất cả các phần tử trong JComboBox.
  • setEditable(boolean b) boolean b xác định xem JComboBox có thể chỉnh sửa được hay không. Nếu b == TRUE thì JComboBox sẽ được chỉnh sửa, ngược lại thì không.
  • setSelectedIndex(int i) – Chọn phần tử của JComboBox tại chỉ mục i.
  • setSelectedItem(Object a) – Chọn phần tử của JComboBox tương ứng với object a.
  • setPopupVisible(boolean v) – Hiển thị popup các phần tử trong JComboBox.
  • setModel(ComboBoxModel a) – Thiết lập mô hình dữ liệu mà JComboBox sử dụng để lấy danh sách các mục.
  • setMaximumRowCount(int count) – Đặt số hàng tối đa mà JComboBox hiển thị.
  • setEnabled(boolean b) – Vô hiệu hoá JComboBox với b = TRUE.
  • isPopupVisible() – Kiểm tra xem popup có đang hiển thị hay không.

Ví dụ tạo JComboBox hiển thị danh sách các thành phố cho người dùng chọn và hiển thị tên của thành phố được chọn.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

class JComboBoxExample {

    // main class
    public static void main(String[] args) {
        // create a new frame
        JFrame f = new JFrame("frame");

        // set layout of frame
        f.setLayout(new FlowLayout());

        // array of string contating cities
        String s1[] = {"Ha Noi", "Dang Nang", "Ho Chi Minh", "Hue", "Tien Giang"};

        JLabel l = new JLabel("Chon thanh pho ");
        JLabel l1 = new JLabel("Ha noi duoc chon");
        l.setForeground(Color.red);
        l1.setForeground(Color.blue);

        // create checkbox
        JComboBox c1 = new JComboBox(s1);
        c1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getSource() == c1) {
                    l1.setText(c1.getSelectedItem() + " duoc chon");
                }
            }
        });
        // create a new panel
        JPanel p = new JPanel();

        p.add(l);

        p.add(c1);

        p.add(l1);

        f.add(p);

        // set the size of frame
        f.setSize(450, 300);

        f.setVisible(true);
    }

}

Output

Tạo JComboBox Editable

Để tạo một JComboBox có thể chỉnh sửa được, chúng ta có thể sử dụng setEditable(true).

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

class JComboBoxExample {

    // main class
    public static void main(String[] args) {
        // create a new frame
        JFrame f = new JFrame("frame");

        // set layout of frame
        f.setLayout(new FlowLayout());

        // array of string contating cities
        String s1[] = {"Ha Noi", "Dang Nang", "Ho Chi Minh", "Hue", "Tien Giang"};

        JLabel l = new JLabel("Chon thanh pho ");
        JLabel l1 = new JLabel("Ha noi duoc chon");
        l.setForeground(Color.red);
        l1.setForeground(Color.blue);

        // create checkbox
        JComboBox c1 = new JComboBox(s1);
        c1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getSource() == c1) {
                    l1.setText(c1.getSelectedItem() + " duoc chon");
                }
            }
        });
        c1.setEditable(true);

        // create a new panel
        JPanel p = new JPanel();

        p.add(l);

        p.add(c1);

        p.add(l1);

        f.add(p);

        // set the size of frame
        f.setSize(450, 300);

        f.setVisible(true);
    }

}

Output

Như các bạn thấy ở trên Dong Nai không chứa trong danh sách các thành phố được liệt kê lúc khởi tạo, tuy nhiên mình đã vào chỉnh sửa lại thành Dong Nai và Enter là xong. Lưu ý Các thành phố được chúng ta chỉnh sửa không được thêm vào danh sách các phần tử của JComboBox.

Custom JcomboBox với ComboBoxModel

Một điểm rất khó chịu mà chúng ta có thể thấy ở trên là các phần tử trong JComboBox chỉ có thể là những kiểu dữ liệu thông thường như String, Integer, etc. 

Giờ chúng ta sẽ áp dụng ComboBoxModel để định nghĩa các phần tử trong JComboBox là các Student nha. 

Bước đầu tiên cần làm là định nghĩa class Student như chúng ta mong muốn. Lưu ý là hàm toString() được sử dụng để lấy giá trị hiển thị trong ComboBox, nếu chúng ta không override method thì mỗi phần tử hiển thị trong ComboBox là địa chỉ vùng nhớ của nó, như vậy sẽ rất khó để xác định.

public class Student {
    private String name;
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return this.name;
    }
}

Bước 2 là định nghĩa Model 

class StudentModel extends DefaultComboBoxModel<Student> {

    public StudentModel(Student[] items) {
        super(items);
    }

}

Cuối cùng chúng ta tạo JComboBox với StudentModel được tạo ở trên. Xử lý sự kiện mỗi lần chọn vào một Student thì sẽ hiển thị tên và tuổi của Student đó.

class solve {

    // main class
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("Combobox example");
        jFrame.setSize(400, 100);
        Student[] students = new Student[] {
                new Student("A", 18),
                new Student("B", 17),
                new Student("C", 22),
                new Student("D", 21),
        };
        StudentModel studentModel = new StudentModel(students);
        JComboBox jComboBox = new JComboBox<>(studentModel);
        jFrame.setLayout(new GridLayout());
        jFrame.getContentPane().add(jComboBox);
        Label label = new Label();

        jComboBox.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                Student student = (Student ) e.getItem();
                label.setText(student.getName() + " - " + student.getAge());
            }
        });

        jFrame.getContentPane().add(label);
        jFrame.setVisible(true);
    }

}

Kết quả chúng ta sẽ có ComboBox gồm 4 Student A,B,C và D.

JComboBox Sortable

Cũng dựa vào kiến thức ở phần trên, chúng ta sẽ tạo ra một JComboBox với các phần tử được sắp xếp theo thứ tự.

Ví dụ sau sẽ tạo một JComboBox với các phần tử có sẵn, và cho phép thêm một phần tử mới vào danh sách các phần tử của ComboBox, sau khi có một phần tử được thêm mới thì nó sẽ được sắp xếp lại nhầm đảm bảo thứ tự các phần tử.

import java.awt.BorderLayout;
import java.util.Arrays;
import java.util.Collections;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class Main {;

    public static void main(String[] args) {

        String[] items = { "A", "B", "C", "D", "E" };
        SortedComboBoxModel model = new SortedComboBoxModel(items);
        JComboBox comboBox = new JComboBox(model);
        JTextField textField = new JTextField(15);
        textField.addActionListener(e -> {
            comboBox.addItem(textField.getText());
            textField.setText("");
            comboBox.showPopup();
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.add(comboBox, BorderLayout.SOUTH);
        frame.add(textField, BorderLayout.WEST);
        frame.add(new JLabel("Enter to add Item  "), BorderLayout.EAST);
        frame.pack();
        frame.setVisible(true);
    }
}

class SortedComboBoxModel extends DefaultComboBoxModel {
    public SortedComboBoxModel() {
        super();
    }
    public SortedComboBoxModel(Object[] items) {
        Arrays.sort(items);
        int size = items.length;
        for (int i = 0; i < size; i++) {
            super.addElement(items[i]);
        }
        setSelectedItem(items[0]);
    }

    public SortedComboBoxModel(Vector items) {
        Collections.sort(items);
        int size = items.size();
        for (int i = 0; i < size; i++) {
            super.addElement(items.elementAt(i));
        }
        setSelectedItem(items.elementAt(0));
    }

    @Override
    public void addElement(Object element) {
        insertElementAt(element, 0);
    }

    @Override
    public void insertElementAt(Object element, int index) {
        int size = getSize();
        for (index = 0; index < size; index++) {
            Comparable c = (Comparable) getElementAt(index);
            if (c.compareTo(element) > 0) {
                break;
            }
        }
        super.insertElementAt(element, index);
    }
}

Output

 

Nguồn tham khảo

https://www.geeksforgeeks.org/java-swing-jcombobox-examples/

http://www.java2s.com/Tutorials/Java/Swing_How_to/JComboBox/index.htm

https://www.codejava.net/java-se/swing/jcombobox-basic-tutorial-and-examples#ComboBoxModel

https://stackoverflow.com/questions/19094845/item-in-jcombobox-instance-of-an-object

Leave a Comment

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