Java 动态填充JComboBox,当它';它用作表格编辑器

Java 动态填充JComboBox,当它';它用作表格编辑器,java,swing,jtable,Java,Swing,Jtable,我有一个用例(在Java Swing中),其中某个JTable列必须通过jcombox编辑器进行编辑,但可选择的值列表取决于行的域对象(我使用的是自定义TableModel) 当编辑停止或取消时,CellEditor界面有要调用的事件,但没有开始编辑的事件(我希望这是填写选择值列表的好地方) 编辑单元格开始时,如何填充组合框?组合框中可用的项目取决于其型号。自定义您的方法(特别是getElementAt(int)方法),以便它参考相关的域对象 您可能希望扩展DefaultComboxModel,

我有一个用例(在Java Swing中),其中某个
JTable
列必须通过
jcombox
编辑器进行编辑,但可选择的值列表取决于行的域对象(我使用的是自定义
TableModel

当编辑停止或取消时,
CellEditor
界面有要调用的事件,但没有开始编辑的事件(我希望这是填写选择值列表的好地方)


编辑单元格开始时,如何填充组合框?

组合框中可用的项目取决于其型号。自定义您的方法(特别是
getElementAt(int)
方法),以便它参考相关的域对象


您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。

ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是
getElementAt(int)
方法),以便它参考相关的域对象


您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。

ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是
getElementAt(int)
方法),以便它参考相关的域对象


您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。

ComboBox中可用的项目是其模型的责任。自定义您的方法(特别是
getElementAt(int)
方法),以便它参考相关的域对象


您可能希望扩展
DefaultComboxModel
,而不是从头开始实现接口。

这是一个问题,我今年早些时候必须解决这个问题(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:

mEntityListModel = getMyEntityModel();

T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());

for (int i = 0; i < items.length; i++) {
    items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);    
旁注:这是如何注册表组合框中的更改的:

tablecolumn.getCellEditor()
           .addCellEditorListener(new CellChangeListener());


private class CellChangeListener implements CellEditorListener {

    @Override
    public void editingStopped(ChangeEvent e) {
        DefaultCellEditor editor;
        Object newValue;
        if (e.getSource() instanceof DefaultCellEditor) {
            editor = (DefaultCellEditor) e.getSource();

            newValue = editor.getCellEditorValue();

            if (newValue != null) {
                //set the newValue for the combobox selection manager
            }
        }
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
}

如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。

这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:

mEntityListModel = getMyEntityModel();

T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());

for (int i = 0; i < items.length; i++) {
    items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);    
旁注:这是如何注册表组合框中的更改的:

tablecolumn.getCellEditor()
           .addCellEditorListener(new CellChangeListener());


private class CellChangeListener implements CellEditorListener {

    @Override
    public void editingStopped(ChangeEvent e) {
        DefaultCellEditor editor;
        Object newValue;
        if (e.getSource() instanceof DefaultCellEditor) {
            editor = (DefaultCellEditor) e.getSource();

            newValue = editor.getCellEditorValue();

            if (newValue != null) {
                //set the newValue for the combobox selection manager
            }
        }
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
}

如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。

这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:

mEntityListModel = getMyEntityModel();

T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());

for (int i = 0; i < items.length; i++) {
    items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);    
旁注:这是如何注册表组合框中的更改的:

tablecolumn.getCellEditor()
           .addCellEditorListener(new CellChangeListener());


private class CellChangeListener implements CellEditorListener {

    @Override
    public void editingStopped(ChangeEvent e) {
        DefaultCellEditor editor;
        Object newValue;
        if (e.getSource() instanceof DefaultCellEditor) {
            editor = (DefaultCellEditor) e.getSource();

            newValue = editor.getCellEditorValue();

            if (newValue != null) {
                //set the newValue for the combobox selection manager
            }
        }
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
}

如您所见,组合框项目列表在编辑器开始工作之前更新。编辑不负责这项工作。

这是一个问题,我必须在今年早些时候解决(下面的代码来自该项目)。解决方案是为组合框创建一个专用模型:

mEntityListModel = getMyEntityModel();

T[] items = (T[]) Array.newInstance(type, mEntityListModel.getSize());

for (int i = 0; i < items.length; i++) {
    items[i] = mEntityListModel.getElementAt(i);
}
mComboBoxModel = new DefaultComboBoxModel<T>(items);    
旁注:这是如何注册表组合框中的更改的:

tablecolumn.getCellEditor()
           .addCellEditorListener(new CellChangeListener());


private class CellChangeListener implements CellEditorListener {

    @Override
    public void editingStopped(ChangeEvent e) {
        DefaultCellEditor editor;
        Object newValue;
        if (e.getSource() instanceof DefaultCellEditor) {
            editor = (DefaultCellEditor) e.getSource();

            newValue = editor.getCellEditorValue();

            if (newValue != null) {
                //set the newValue for the combobox selection manager
            }
        }
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
}

如您所见,组合框项目列表在编辑器开始工作之前更新。编辑器不负责该工作。

一种方法是重写JTable的
getCellEditor(…)
方法:

import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JPanel
{
    List<String[]> editorData = new ArrayList<String[]>(3);

    public TableComboBoxByRow()
    {
        setLayout( new BorderLayout() );

        // Create the editorData to be used for each row

        editorData.add( new String[]{ "Red", "Blue", "Green" } );
        editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
        editorData.add( new String[]{ "Apple", "Orange", "Banana" } );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 3)
                {
                    JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
                    return new DefaultCellEditor( comboBox1 );
                }
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Combo Box by Row");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableComboBoxByRow() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
import java.awt.*;
导入java.util.List;
导入java.util.ArrayList;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类TableComboBoxByRow扩展了JPanel
{
List editorData=new ArrayList(3);
公共表ComboxBoxByRow()
{
setLayout(新的BorderLayout());
//创建要用于每行的editorData
add(新字符串[]{“红色”、“蓝色”、“绿色”});
add(新字符串[]{“圆”、“正方形”、“三角形”});
add(新字符串[]{“Apple”、“Orange”、“Banana”});
//使用默认数据创建表
对象[][]数据=
{
{“颜色”,“红色”},
{“形状”,“正方形”},
{“水果”,“香蕉”},
{“纯”、“文本”}
};
字符串[]columnNames={“类型”,“值”};
DefaultTableModel=新的DefaultTableModel(数据、列名称);
JTable表格=新JTable(型号)
{
//确定行要使用的编辑器
公共表CellEditor getCellEditor(int行,int列)
{
int modelColumn=convertColumnIndexToModel(列);
if(modelColumn==1&&row<3)
{
JComboBox comboBox1=新的JComboBox(editorData.get(row));
返回新的DefaultCellEditor(comboBox1);
}
其他的
返回super.getCellEditor(行、列);
}
};
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格);
}
私有静态void createAndShowUI()
{
JFrame frame=新JFrame(“按行排列的表格组合框”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(新的tableComboxByRow());
框架。设置尺寸(200200);
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowUI();
}
});
}
}

一种方法是重写JTable的
getCellEditor(…)
方法:

import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JPanel
{
    List<String[]> editorData = new ArrayList<String[]>(3);

    public TableComboBoxByRow()
    {
        setLayout( new BorderLayout() );

        // Create the editorData to be used for each row

        editorData.add( new String[]{ "Red", "Blue", "Green" } );
        editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
        editorData.add( new String[]{ "Apple", "Orange", "Banana" } );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 3)
                {
                    JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
                    return new DefaultCellEditor( comboBox1 );
                }
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Combo Box by Row");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableComboBoxByRow() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
import java.awt.*;
导入java.util.List;
导入java.util.ArrayList;
导入javax.swing.*;
导入javax.swing.border.*;
导入javax.swing.table.*;
公共类TableComboBoxByRow扩展了JPanel
{
列表编辑器数据=ne