Java 对于JTable的一列,如何在每行中放置唯一的组合框编辑器?

Java 对于JTable的一列,如何在每行中放置唯一的组合框编辑器?,java,swing,jtable,jcombobox,tablecelleditor,Java,Swing,Jtable,Jcombobox,Tablecelleditor,想法是这样的:假设我有一个类扩展了TableModel,它有一个类似于列表集合的字段。在一个事件中,我想清除一个JTable,并重新添加行,其中一个特定列是一个组合框;组合框n中的项目是来自集合的列表中的项目。在我的列表中获取(n)。因此,我迭代集合添加行,并迭代每个集合。get(n)添加组合框项 没有事件侦听器。当单击一个单独的按钮时,只要能在每个组合框上getSelectedIndex,我就可以计算出需要发生什么 我花了两个半小时把我的GUI变成了代码意大利面,在这里我几乎扩展了所有东西,并

想法是这样的:假设我有一个类扩展了
TableModel
,它有一个类似于
列表集合的字段。在一个事件中,我想清除一个
JTable
,并重新添加行,其中一个特定列是一个组合框;组合框
n
中的项目是来自
集合的
列表中的项目。在我的列表中获取(n)
。因此,我迭代
集合
添加行,并迭代每个
集合。get(n)
添加组合框项

没有事件侦听器。当单击一个单独的按钮时,只要能在每个组合框上
getSelectedIndex
,我就可以计算出需要发生什么

我花了两个半小时把我的GUI变成了代码意大利面,在这里我几乎扩展了所有东西,并且几乎所有东西都有最大的耦合。我想我甚至可能有两个不相交的
JComboBox
实例集合。我这样说是为了强调,发布我目前拥有的任何代码对我绝对没有好处

我已经读过了,没有一个我能理解的解释


因此,基本上我只需要知道我需要什么,因为我找不到任何资源。

因此,基本上,你需要一个
TableCelLEditor
,它能够用可用列表中的行播种
JComboBox

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TableCellEditor {

    public static void main(String[] args) {
        new TableCellEditor();
    }

    public TableCellEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                List<List<String>> values = new ArrayList<>(25);
                for (int row = 0; row < 10; row++) {

                    List<String> rowValues = new ArrayList<>(25);
                    for (int index = 0; index < 10; index++) {
                        rowValues.add("Value " + index + " for row " + row);
                    }
                    values.add(rowValues);

                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"Data"}, 10);
                JTable table = new JTable(model);
                table.setShowGrid(true);
                table.setGridColor(Color.GRAY);
                table.getColumnModel().getColumn(0).setCellEditor(new MyEditor(values));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class MyEditor extends DefaultCellEditor {

        private List<List<String>> rowValues;

        public MyEditor(List<List<String>> rowValues) {
            super(new JComboBox());
            this.rowValues = rowValues;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

            JComboBox cb = (JComboBox) getComponent();
            List<String> values = rowValues.get(row);
            DefaultComboBoxModel model = new DefaultComboBoxModel(values.toArray(new String[values.size()]));
            cb.setModel(model);

            return super.getTableCellEditorComponent(table, value, isSelected, row, column);

        }

    }

}

导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.DefaultCellEditor;
导入javax.swing.DefaultComboxModel;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.DefaultTableModel;
公共类TableCellEditor{
公共静态void main(字符串[]args){
新的TableCellEditor();
}
公共表编辑器(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
列表值=新的ArrayList(25);
对于(int行=0;行<10;行++){
List rowValues=new ArrayList(25);
对于(int-index=0;index<10;index++){
行值。添加(“值”+索引+”表示行+行);
}
添加(行值);
}
DefaultTableModel=new DefaultTableModel(新对象[]{“数据”},10);
JTable table=新的JTable(模型);
表.设置显示网格(真);
table.setGridColor(颜色为灰色);
table.getColumnModel().getColumn(0.setCellEditor(新的MyEditor(值));
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的JScrollPane(表));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类MyEditor扩展了DefaultCellEditor{
私有列表行值;
公共MyEditor(列出行值){
super(新JComboBox());
this.rowValues=rowValues;
}
@凌驾
公共组件getTableCellEditorComponent(JTable表、对象值、布尔isSelected、int行、int列){
JComboBox cb=(JComboBox)getComponent();
列表值=行值。获取(行);
DefaultComboxModel=newDefaultComboxModel(values.toArray(新字符串[values.size()]);
cb.setModel(model);
返回super.getTableCellEditorComponent(表、值、isSelected、行、列);
}
}
}

首先,TableModel用于为要查看的数据建模,因此不要担心尝试将组合框或组合值放入其中。相反,建立一个TableCellEditor并将其传递给列表。当编辑单元格时,表将需要编辑器组件,它将传递行和列索引。简单地准备ComboBoxModel,基于您需要的行值,并将其种子添加到EditorTanks,以获得快速清晰的响应!遗憾的是,我没有投票权。我没有更多的错误,删除了大约80%的相关代码,这些代码实际上没有做任何事情,现在我又被卡住了:该列只显示每个列表的toString,不响应鼠标。我不知道我是否需要对渲染做些什么。看看,看看自定义渲染部分。表模型的
isCellEditable
可能返回false,这意味着单元格不可编辑。如果你仍然有问题,最好的选择是发布另一个问题与你有什么