[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 đó.
JList in java

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:

add or remove item in JList

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