Jtable表格中添加下拉框 并且实现每个下拉框数据都来自动态实现

首先创建必须创建一个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();
    }
}

上面的代码粘贴到本地可以直接运行,效果如下图
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值