最近因项目需要具体在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);
}
}
});
现在使用,他可以多选了