[Java Swing] JComboBox trong Java – JComboBox in Java
Nội dung
Cách tạo JComboBox
Bắt sự kiện cho JComboBox
JComboBox là một đối tượng cho phép bạn lựa chọn một phần tử khi click vào mũi tên của nó. Ví dụ như ta có một JFrame chọn lá cờ từ JComboBox như sau:
Bây giờ chúng ta sẽ đi tìm hiểu JComboBox bằng cách tạo một JFrame giống như trên.
Cách tạo JComboBox
Để tạo được JComboBox chúng ta sử dụng các hàm khởi tạo như sau:
– JComboBox(): Tạo JComboBox chưa có dữ liệu
– JComboBox(ComboBoxModel aModel): Tạo JComboBox với Model được chỉ định
– JComboBox(E[] items): Tạo JComboBox với các phần tử nằm trong mảng E
– JComboBox(Vector items): Tạo JComboBox với các phần tử trong Vector E
Chương trình dưới đây sẽ tạo JFrame giống như đầu bài. Nó chứa main panel là một JPanel. main panel này được đặt BorderLayout và chứa JComboBox chọn nước ở PAGE_START, JLabel hiển thị cờ của nước được chọn đặt ở CENTER. Trong code dùng 2 mảng String arrFlag để lấy tên cờ ứng với tên các nước và arrCountry để hiển thị tên nước trong JComboBox.
package nguyenvanquan7826.JComboBox; import java.awt.BorderLayout; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class MyJComboBox extends JFrame { private JComboBox<String> cbbCountry; private JLabel lbShow; private String[] arrFlag = { "vn", "china", "us", "lao", "en" }; private String[] arrCountry = { "Việt Nam", "Trung Quốc", "Mỹ", "Lào", "Anh" }; public MyJComboBox() { // add main panel to JFrame add(createMainPanel()); // set Display setTitle("JComboBox"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); setLocationRelativeTo(null); setVisible(true); } // create main panel with BorderLayout private JPanel createMainPanel() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new EmptyBorder(10, 10, 10, 10)); // add a JComboBox to top of main panel panel.add(cbbCountry = createComboBox(arrCountry), BorderLayout.PAGE_START); // get flag name with country is selected in JComboBox String flag = arrFlag[cbbCountry.getSelectedIndex()]; // add JLabel to show flag panel.add(lbShow = createLabel(flag), BorderLayout.CENTER); return panel; } // create a JComboBox with list item in ArrayList private JComboBox<String> createComboBox(String[] arrItem) { JComboBox<String> cbb = new JComboBox<String>(arrItem); return cbb; } // create JLabel to show flag with private JLabel createLabel(String flagName) { JLabel lb = new JLabel(getFlag(flagName)); return lb; } // get flag with name is flagName private ImageIcon getFlag(String flagName) { ImageIcon flag = new ImageIcon(getClass().getResource( "/nguyenvanquan7826/JComboBox/" + flagName + ".png")); return flag; } public static void main(String[] args) { new MyJComboBox(); } }
Mặc định khi khởi tạo JComboBox, nếu có phần tử trong nó thì phần tử đầu tiên sẽ được chọn. Để xác định phần tử được chọn ta có thể dùng các phương thức getSelectedIndex() (lấy vị trí phần tử được chọn) hoặc getSelectedItem() (lấy phần tử được chọn) tùy theo cách và mục đích khác nhau. Các bạn chú ý khi lấy ảnh thì cần sửa lại đường dẫn theo đúng với nơi đặt ảnh của các bạn, ảnh của mình được đặt cùng package với file *java. (download ảnh tại đây)
Các bạn để ý là ở code trên chưa bắt sự kiện khi chọn các phần tử trong JComboBox nên khi chọn nước khác thì cờ không hề thay đổi.
Bắt sự kiện cho JComboBox
Để có thể bắt sự kiện khi chọn các phần tử trong JComboBox chúng ta cần addActionListener cho JComboBox. Khi đó chúng ta phải implemets Interface ActionListener và viết đè phương thức actionPerformed(ActionEvent e). Khi đó chúng ta sẽ so sánh trong phương thức này để xác định và xử lý JComboBox được tác động. Chúng ta có code hoàn chỉnh như sau:
package nguyenvanquan7826.JComboBox; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class MyJComboBox extends JFrame implements ActionListener { private JComboBox<String> cbbCountry; private JLabel lbShow; private String[] arrFlag = { "vn", "china", "us", "lao", "en" }; private String[] arrCountry = { "Việt Nam", "Trung Quốc", "Mỹ", "Lào", "Anh" }; public MyJComboBox() { // add main panel to JFrame add(createMainPanel()); // set Display setTitle("JComboBox"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 300); setLocationRelativeTo(null); setVisible(true); } // create main panel with BorderLayout private JPanel createMainPanel() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new EmptyBorder(10, 10, 10, 10)); // add a JComboBox to top of main panel panel.add(cbbCountry = createComboBox(arrCountry), BorderLayout.PAGE_START); // get flag name with country is selected in JComboBox String flag = arrFlag[cbbCountry.getSelectedIndex()]; // add JLabel to show flag panel.add(lbShow = createLabel(flag), BorderLayout.CENTER); return panel; } // create a JComboBox with list item in ArrayList private JComboBox<String> createComboBox(String[] arrItem) { JComboBox<String> cbb = new JComboBox<String>(arrItem); cbb.addActionListener(this); return cbb; } // create JLabel to show flag with private JLabel createLabel(String flagName) { JLabel lb = new JLabel(getFlag(flagName)); return lb; } // get flag with name is flagName private ImageIcon getFlag(String flagName) { ImageIcon flag = new ImageIcon(getClass().getResource( "/nguyenvanquan7826/JComboBox/" + flagName + ".png")); return flag; } // change flag when select items in JComboBox private void changeFlag() { lbShow.setIcon(getFlag(arrFlag[cbbCountry.getSelectedIndex()])); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == cbbCountry) { changeFlag(); } } public static void main(String[] args) { new MyJComboBox(); } }
Đọc thêm: class JComboBox, use JComboBox
private ImageIcon getFlag(String flagName) {
ImageIcon flag = new ImageIcon(getClass().getResource(
“/nguyenvanquan7826/JComboBox/” + flagName + “.png”));
return flag;
}
em dùng hàm này thì có vấn đề.
khi em sửa lại thành:
private ImageIcon getFlag(String flagName){
ImageIcon icon = new ImageIcon(“/home/manhduy/Desktop/” + flagName + “.png”);
return icon;
}
thì lại chạy ngon.
anh xem lại xem có vấn đề gì k?
đường dẫn em lấy là ở trong máy của em.
2 đường dẫn bên trên là khác nhau mà bạn. Bạn xem đường dẫn bên trên đúng chưa.
em cop cái trên là đường của anh, nhưng khi em chạy em vẫn lấy đường của em.
Đã fix xong.