【问题标题】:Setting a JComboBox editor using TableModelListener使用 TableModelListener 设置 JComboBox 编辑器
【发布时间】:2017-09-27 11:51:25
【问题描述】:

我想使用TableModelListener 将我的第二列设置为JComboBox 编辑器。还想根据第一列中选​​定的 ComboBox 更改第二列 ComboBox 的 Model。在这里,我实现了一个监听器,它监听第一列。

private class TableScheduleListener implements TableModelListener
{
    //Listening for data changes.
    @Override
    public void tableChanged(TableModelEvent e) 
    {
        int row = e.getFirstRow();
        int column = e.getColumn();
    }

    if(column == 1)
    {
            for(int i = 0; i < createScheduleView.tblSchedule.getRowCount(); i++)
            {
                createScheduleView.tblSchedule.getCellEditor(i, 2);
            }

            int col = createScheduleView.tblSchedule.convertColumnIndexToModel(2);

            if(col == 2 && createScheduleView.tblSchedule.getRowCount() < 7)
            {
                DefaultComboBoxModel cbModel = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
                createScheduleView.cbBreakStartTime.setModel(cbModel);
            }
     }
}

但我在想如何在我的第二列中将 JComboBox 设置为编辑器。设置后是型号?任何帮助将不胜感激。

更新

我遵循了 https://tips4java.wordpress.com/2009/06/28/combo-box-table-editor/ 的 camickr 提示 但想从不同的班级覆盖TableCellEditor

private class TableScheduleEditor extends JTable
{
    //  Determine editor to be used by row
    @Override
    public TableCellEditor getCellEditor(int row, int column)
    {
        int modelColumn = convertColumnIndexToModel(column);

        if(modelColumn == 2 && row < 7)
        {
            DefaultComboBoxModel model = new DefaultComboBoxModel(createScheduleModel.setData().toArray());
            createScheduleView.getCbBreakStartTime().setModel(model);
            return new DefaultCellEditor(createScheduleView.getCbBreakStartTime());
        }

        else
            return super.getCellEditor(row, column);
    };
}

我在想这个类如何在我的 JTable 中注册? 我试图在我的构造函数中注册它this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor()); 但它说不能转换为 TableCellEditor,因为它扩展了 JTable。有什么诀窍吗?

【问题讨论】:

    标签: java swing jtable jcombobox tablecelleditor


    【解决方案1】:

    还想根据第一列中选​​择的 ComboBox 更改第二列 ComboBox 的模型

    覆盖JTablegetCellEditor(...) 方法以返回相应的编辑器。

    这是一个让您入门的基本示例:

    import java.awt.*;
    import java.util.List;
    import java.util.ArrayList;
    import javax.swing.*;
    import javax.swing.event.*;
    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();
                }
            });
        }
    }
    

    在上面的示例中,“模型”会根据正在编辑的行发生变化。

    在您的情况下,您需要修改逻辑以根据第一列中的值返回编辑器。

    【讨论】:

    • 这确实有效!是否可以通过扩展JTable 在不同的类中覆盖它?但是我怎样才能在这个类中注册我的表呢?请看我上面的更新。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2010-12-19
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多