Java Swing实现JList添加JCheckBox复选框

最近因项目需要具体在JList 框内添加复选框, 网上找了下相关例子,进行下改造,记录一下,这需要实现功能的话就必须重写复选框JCheckBox。

话不多说我们贴上一段图

大概书写一番,Jlist单纯添加数据进去之后大概就是这样

而我们现在需要的便是添加控件。首先我们需要自己写一个类继承JCheckBox。但是查了API发现,光继承没有用,Jlist的方法内没有一个参数是JCheckBox的方法。但是我们发现了一个参数ListCellRenderer接口的方法setCellRenderer(ListCellRenderer<? super E> cellRenderer);

那么ListCellRenderer接口是什么?API的解释是识别可以用作“橡皮图章”来绘制JList中的单元格的组件。就相当于界面绘制器。

那么我们只需要让写的那个继承JCheckBoxd的类,实现这个ListCellRenderer接口。

具体代码如下:

MyJcheckBox.java

package org.seles.extend;

import java.awt.Component;

import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class MyJcheckBox extends JCheckBox implements ListCellRenderer {
	public MyJcheckBox() {
		super();
	}

	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
			boolean cellHasFocus) {
		this.setText(value.toString());
		setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
		setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
		this.setSelected(isSelected);
		return this;
	}
}

那么现在,我们在这个JList内添加这个类呢。

JlistJframe.java

package org.lanqiao.jframe;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;

import org.lanqiao.extend.MyJcheckBox;

public class JlistJframe extends JFrame {

	private JPanel contentPane;
	private JList list;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JlistJframe frame = new JlistJframe();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public JlistJframe() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(565, 576);
		setTitle("Jlist多选状态");
		setLocationRelativeTo(null);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(83, 132, 369, 213);
		contentPane.add(scrollPane);
		
		list = new JList();
		scrollPane.setViewportView(list);
		setList();
	}
	protected void setList(){
		Object[] listData= {111,222,333,444};
		list.setListData(listData);
		MyJcheckBox cell = new MyJcheckBox();
		list.setCellRenderer(cell);
	}

}

现在运行发现有下拉框了,但是还是不能多选啊。

那接下来。我们需要继续翻查API,百度,发现JList控件的内容有可多选需要设置

但是Jlist有setSelectionModel();方法

那么我们重写一下方法

		list.setSelectionModel(new DefaultListSelectionModel() {
			@Override
			public void setSelectionInterval(int index0, int index1) {
				if (super.isSelectedIndex(index0)) {
					super.removeSelectionInterval(index0, index1);
				} else {
					super.addSelectionInterval(index0, index1);
				}
			}
		});list.setSelectionModel(new DefaultListSelectionModel() {
			@Override
			public void setSelectionInterval(int index0, int index1) {
				if (super.isSelectedIndex(index0)) {
					super.removeSelectionInterval(index0, index1);
				} else {
					super.addSelectionInterval(index0, index1);
				}
			}
		});

现在使用,他可以多选了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值