简体   繁体   English

使用TableModelListener设置JComboBox编辑器

[英]Setting a JComboBox editor using TableModelListener

I wanted to set my 2nd column as JComboBox editor using TableModelListener . 我想使用TableModelListener将第二列设置为JComboBox编辑器。 Also wanted to change the Model of ComboBox in 2nd column based on selected ComboBox in 1st column. 还希望根据第一列中选​​择的组合框来更改第二列中的组合框模型 Here I implemented a Listener that's listen to 1st column. 在这里,我实现了一个监听第一列的监听器。

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);
            }
     }
}

But I'm thinking how can I set as JComboBox as editor in my 2nd column. 但是我在考虑如何在第二列中将JComboBox设置为编辑器。 After settings it's model? 设置后是模型吗? Any help would appreciated. 任何帮助,将不胜感激。

UPDATE 更新

I followed camickr tips from https://tips4java.wordpress.com/2009/06/28/combo-box-table-editor/ But wanted to override TableCellEditor from different class. 我遵循了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);
    };
}

I'm thinking how this class can register in my JTable? 我在想该类如何在我的JTable中注册? I tried to register this in my constructor this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor()); 我试图将其注册到我的构造函数中this.createScheduleView.tblSchedule.setCellEditor(new TableScheduleEditor()); But it says cannot be converted to TableCellEditor because it extends JTable. 但是它说不能扩展到TableCellEditor,因为它扩展了JTable。 Any trick to do this? 有什么窍门吗?

Also wanted to change the Model of ComboBox in 2nd column based on selected ComboBox in 1st column 还想根据第一列中选​​择的组合框来更改第二列中的组合框模型

Override the getCellEditor(...) method of the JTable to return the appropriate editor. 重写JTablegetCellEditor(...)方法以返回适当的编辑器。

Here is a basic example to get you started: 这是一个入门的基本示例:

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

In the above example the "model" changes based on the row being edited. 在上面的示例中,“模型”基于正在编辑的行而更改。

In your case you will need to modify the logic to return the editor based on the value in the first column. 在您的情况下,您将需要修改逻辑以根据第一列中的值返回编辑器。

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

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