[JavaSwing] JList trong Java – JList in Java
Nội dung
Tạo và bắt sự kiện trong JList
Thêm bớt phần tử trong JList
JList cho phép hiển thị một danh sách các đối tượng cùng nhóm. Trong bài này chúng ta sẽ tìm hiểu những vấn đề cơ bản về nó.
Tạo và bắt sự kiện trong JList
Chúng ta sẽ đi tạo một chương trình có chứa 1 JList gồm các màu, khi click chọn một màu nào đó thì màu nền của JFrame sẽ thay đổi theo tên màu đó.
package nguyenvanquan7826.JList; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class JListDemo extends JFrame { private int width = 200; private int height = 250; // create array string color to show in list String[] colorName = { "blue", "green", "red" }; // create array color Color[] backGroundColor = { Color.blue, Color.green, Color.red }; JList<String> myJList; // create JList width array color public JListDemo() { // set layout for contenPane getContentPane().setLayout(new FlowLayout()); // add list color add(createJList()); // set display setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(width, height); setLocationRelativeTo(null); setVisible(true); } private JList createJList() { // create list myJList = new JList<String>(colorName); // add listen to get action when select item in JList myJList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { changeBackGround(); } }); return myJList; } // change background JFrame private void changeBackGround() { getContentPane().setBackground( backGroundColor[myJList.getSelectedIndex()]); } public static void main(String[] args) { new JListDemo(); } }
* Các phương thức khởi tạo của JList:
– JList(): tạo một JList rỗng
– JList(E[] listData): tạo 1 JList với một mảng dữ liệu
– JList(ListModel dataModel): tạo JList với một model đã có
– JList(Vector listData): tạo JList với dữ liệu trong vecto
* Cách bắt sự kiện khi chọn một item trong list ta add phương thức addListSelectionListener cho JList. Sau đó sẽ viết đè phương thức valueChanged để thực hiện công việc mong muốn. Sử dụng phương thức getSelectedIndex để lấy vị trí được chọn trong JList
* Chú ý trong Ví dụ trên do chúng ta sử dụng trực tiếp JFrame nên muốn thay đổi được màu nền của Frame chúng ta cần setLayout cho JFrame và khi thực hiện thay màu nền cần thưc hiện gọi getContentPane().setBackground.
Thêm bớt phần tử trong JList
Ví dụ tiếp theo dưới đây sẽ thực hiện việc thêm bớt phần tử trong JList. JFrame chứa 1 JPanel (main panel), main panel này dược setLayout là BorderLayout và chứa các đối tượng như ở hình dưới đây:
Khi Chọn phần từ trong JList và ấn Delete hoặc Add thì sẽ xóa phần tử được chọn hoặc thêm phần tử trong JTextFiel vào JList.
package nguyenvanquan7826.JList; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class JListAddOrRemoveItem extends JFrame implements ActionListener { private int width = 200; private int height = 250; private JTextField tfAdd; private JList<String> myList; public JListAddOrRemoveItem() { // add main panel add(createMainPanel()); // display setTitle("Add - remove item in JList"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(width, height); setLocationRelativeTo(null); setVisible(true); } private JPanel createMainPanel() { // create main panel JPanel panel = new JPanel(new BorderLayout()); // set border empty for main panel panel.setBorder(new EmptyBorder(0, 10, 10, 10)); // add content panel.add(createDeletePanel(), BorderLayout.PAGE_START); panel.add(createAddPanel(), BorderLayout.PAGE_END); panel.add(createList(), BorderLayout.CENTER); return panel; } // delete panel in top of frame private JPanel createDeletePanel() { JPanel panel = new JPanel(); panel.add(createButton("Delete")); return panel; } // add panel in bottom of frame private JPanel createAddPanel() { JPanel panel = new JPanel(new GridLayout(0, 1)); panel.add(tfAdd = new JTextField()); panel.add(createButton("Add")); return panel; } // create Jlist private JList<String> createList() { // create defaultListModel DefaultListModel<String> model = new DefaultListModel<>(); // add element to model model.addElement("Java"); model.addElement("C#"); // set model to JList myList = new JList<String>(model); return myList; } // create a button private JButton createButton(String btnName) { JButton btn = new JButton(btnName); btn.addActionListener(this); return btn; } private void deleteItem() { // get model of Jlist DefaultListModel<String> model = (DefaultListModel<String>) myList .getModel(); // delete item is selected if (!model.isEmpty() && myList.getSelectedIndex() >= 0) { model.remove(myList.getSelectedIndex()); } // set model for JList myList.setModel(model); } private void addItem() { String item = tfAdd.getText().trim(); if (item.equals("")) { JOptionPane.showMessageDialog(null, "Pleas enter item add to Jlist", "Error", JOptionPane.ERROR_MESSAGE); } else { DefaultListModel model = (DefaultListModel) myList.getModel(); model.addElement(item); myList.setModel(model); tfAdd.setText(""); } } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "Delete") { deleteItem(); return; } if (e.getActionCommand() == "Add") { addItem(); } } public static void main(String[] args) { new JListAddOrRemoveItem(); } }
Trong ví dụ này JList được khởi tạo với 1 model là DefaultListModel, đó là 1 model mà Java xây dựng sẵn cho chúng ta, nó rất dễ sử dụng. Việc thêm bớt phần tử vào JList bắt buộc chúng ta phải thực hiện thông qua model của JList chứ không thể làm trực tiếp được (Trừ khi mỗi lần thêm bớt bạn dùng 1 list (hoặc mảng) các phàn tử và lại tạo lại JList đó). Chi tiết các bước làm đã được chú thích rõ trong code, các bạn theo dõi trong đó.
Đọc thêm: use JList, class JList, custom JList
có cách nào để setEnable(false) 1 item cụ thể trong jlist không admin
Mình cũng chưa thử. 🙂
chào ad, cho mình hỏi trong jlist khi muốn click vào một item có thể gọi frame khác làm ntn ạ! vd: có 1 list phòng ban khi click dô một item bất kì thì sẽ gọi đc tới frame nhân viên
Cái này mình cũng chưa thử. Lâu rồi cũng không động lại nó. ^^ Bạn thử tìm google xem nhé.
admin có code tính cộng trừ nhân chia sử dụng JList không? cho em xin với