在开发过程中,有时会遇到需要把表格单元格渲染成下拉框的情况,且下拉框中的数据是根据情况动态变化的。一般情况,对于这种情况,一般只需要设置编辑器即可,渲染器则可以不用设置。代码如下:
package com.a;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class Demo2 {
public static void main(String[] args) {
JFrame frame = new JFrame();
JTable table = new JTable();
DefaultTableModel model = new DefaultTableModel();
String[] columnIdentifiers = {"one", "two", "three"};//表头
String[][] data = new String[5][3];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
if(j == 2) {
continue;
}
data[i][j] = "asd";
}
}
model.setDataVector(data, columnIdentifiers);
table.setModel(model);
//强烈建议用Vector集合来作为下拉框的选项值,方便删除修改下拉框中选项值的内容。
Vector<String> vector = new Vector<String>();
vector.add("a");
vector.add("b");
vector.add("c");
final JComboBox<String> comboBox = new JComboBox<String>(vector);
//下拉框监听
comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
System.out.println(comboBox.getSelectedItem());
}
}
});
//表格编辑器
table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(comboBox));
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane);
frame.setBounds(100, 100, 300, 200);
frame.setVisible(true);
}
}
如果需要动态变化下拉框选项值的内容,修改Vector集合即可。
效果图如下:
点击单元格时才会看到下拉框,失去焦点后就是正常的单元格。
特别提醒:以上代码的内容,实际上第三列用的是同一个下拉框,所以,在进行下拉框监听的时候,如果上一行选中了下拉框第二项,下一行再选中同一项时,不会触发下拉框选项监听事件。