首先创建必须创建一个combox的CellEditor 和 Renderer
CellEditor 是combox在Jtable中的编辑器
Renderer 是combox在Jtable中的渲染器
不耐心的同学们可以直接翻到最下面查看完整演示。
添加Jcombox的必须的步骤
创建renderer类
class comboxRenderer extends JComboBox implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String[] values = (String[])value ;
JComboBox box=new JComboBox(values);
return box;
}
}
创建CellEditor 类
···java
class comboxCellEditor extends AbstractCellEditor implements TableCellEditor {
JComboBox box;
Object Gvalue;
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
String[] values = (String[])value;
Gvalue=value;
box =new JComboBox(values);
box.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
String item = e.getItem().toString();
int stateChange = e.getStateChange();
System.out.println(e.getStateChange());
if (stateChange == ItemEvent.SELECTED) {
//关闭编辑状态 dsTable为当前所渲染的Jtable,我这里是全局变量,所以 可以在内部类引用
dsTable.getCellEditor().stopCellEditing();
}else if (stateChange == ItemEvent.DESELECTED) {
// System.out.println("此次事件由取消选中“" + item + "”触发!");
}else {
}
}
});
return box;
}
@Override
public Object getCellEditorValue() {
ArrayList<String> StringList=new ArrayList<>();
StringList.add((String)box.getSelectedItem());
String [] args =(String[]) Gvalue;
for(int i=0;i<args.length;i++)
{
if(!args[i].equals(box.getSelectedItem())){
StringList.add(args[i]);
}
}
String [] strings= StringList.toArray(new String[args.length]);
return strings;
}
}
···
创建渲染器与编辑器对象
在渲染jtable的代码中进行创建这两个对象 并且进行 添加到 表格的某一列的 渲染器和编辑器中
comboxCellEditor editor = new comboxCellEditor();
comboxRenderer renderer = new comboxRenderer();
将对象添加到表格的model中
dsTable.getColumnModel().getColumn(3).setCellRenderer(renderer);
dsTable.getColumnModel().getColumn(3).setCellEditor(editor);
再添加数据到tablemodel中
defaultTableModel.addRow(new Object[]{
new Boolean(false),
0,
"",
addFourthColumnElement(produceInfo), //这是一个方法
"",
"
});
···
addFourthColumnElement方法如下(这个方式主要就是为了告诉大家,这一列的元素必须添加时就是以String数组的形式添加。)
private String[] addFourthColumnElement(ProduceInfo produceInfo){
int size =produceInfo.getProduceVersion().size();
String [] values=produceInfo.getProduceVersion().toArray(new String[size]);
return values;
}
这个方法是我公司代码里面提取的,主要是用于返回一个string数组,因为jcombox的value只能设置为数据,所以添加他的value时就必须添加为value
运行效果如下
本人由于时间有限,看不懂或者调试代码有问题可以联系我 QQ 1159856928
完整代码展示与效果图
这部分代码是根据之前公司代码进行了精简,因为有部分人私信我看不懂代码,说以我写了一个精简的demo,大家可以拿来即用。
/**
* Project Name: ***
* File Name: Mytable
* Package Name: ****
* Date: 2020/4/28 18:02
* Copyright (c) 2020,All Rights Reserved.
*/
package ****;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.util.ArrayList;
/**
* @Author: zhangjun
* @Description:
* @Date: Create in 18:02 2020/4/28
*/
public class MyTable extends JTable {
/**
* 序列化
*/
private static final long serialVersionUID = 1L;
public void aaaa() {
MyTable table = new MyTable();
final String[] columnNames = new String[]{
"","序号"};
DefaultTableModel defaultTableModel = new DefaultTableModel(new String[][]{}, columnNames);
String[] values = new String[] { "5", "2", "3" };//这是下拉框的元素 由于是下拉框,这里必须是string数组传入
String[] value1 = new String[] { "3", "2", "1" };
String[] value2 = new String[] { "7", "8", "1" };
table.setModel(defaultTableModel);
defaultTableModel.addRow(new Object[]{"1",values});//将下拉框元素传入table的tablemodel中
defaultTableModel.addRow(new Object[]{"2",value1});
defaultTableModel.addRow(new Object[]{"2",value2});
table.getModel().getColumnName(1);
table.getColumnModel().getColumn(1).setCellEditor(new MyComboBoxEditor());
table.getColumnModel().getColumn(1).setCellRenderer( new comboxRenderer());
JScrollPane jp=new JScrollPane(table);
jp.setViewportView(table);
jp.setSize(400,300);
JFrame jf=new JFrame();
jf.getContentPane().add(jp);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(400,300);
jf.setVisible(true);
}
class MyComboBoxEditor extends AbstractCellEditor implements TableCellEditor {
JComboBox box;
Object Gvalue;
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
String[] values = (String[])value;
Gvalue=value;
box =new JComboBox(values);
return box;
}
@Override
public Object getCellEditorValue() {
ArrayList<String> StringList=new ArrayList<>();
StringList.add((String)box.getSelectedItem());
String [] args =(String[]) Gvalue;
for(int i=0;i<args.length;i++)
{
if(!args[i].equals(box.getSelectedItem())){
StringList.add(args[i]);
}
}
String [] strings= StringList.toArray(new String[args.length]);
return strings;
}
}
class comboxRenderer extends JComboBox implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
String[] values = (String[])value ;
JComboBox box=new JComboBox(values);
return box;
}
}
public static void main(String[] args) {
MyTable table = new MyTable();
table.aaaa();
}
}
上面的代码粘贴到本地可以直接运行,效果如下图