繁体   English   中英

使用TableModelListener设置JComboBox编辑器

[英]Setting a JComboBox editor using TableModelListener

我想使用TableModelListener将第二列设置为JComboBox编辑器。 还希望根据第一列中选​​择的组合框来更改第二列中的组合框模型 在这里,我实现了一个监听第一列的监听器。

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。 有什么窍门吗?

还想根据第一列中选​​择的组合框来更改第二列中的组合框模型

重写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();
            }
        });
    }
}

在上面的示例中,“模型”基于正在编辑的行而更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM