0

camickr我使用下面提供的代码作为参考添加了一个组合框作为单元格编辑器:

如何将唯一的 JComboBoxes 添加到 JTable 中的列(Java)

除了在我的情况下,我只需要一个组合框供一列中的所有单元格使用。我遇到的问题是组合框会自动选择最后一个选定的项目(或当前选定的项目,不确定),并且由于不同的行共享相同的组合框,如果您单击其中一个单元格,它将自动更改到最后选择的项目。

作为一个快速演示,我只是修改了上面的代码来显示问题。我希望组合框自动选择列表中的项目,该项目等于所选单元格中设置的项目(而不是选择一个单元格,然后自动更改该单元格的内容)

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

public class Test extends JFrame
{
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);

    public Test()
    {
        // Create the editors to be used for each row

        String[] items1 = { "Red", "Blue", "Green" };
        JComboBox comboBox1 = new JComboBox( items1 );
        DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 );
        editors.add( dce1 );

        //  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)
                    return editors.get(0);
                else
                    return super.getCellEditor(row, column);
            }
        };

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

    public static void main(String[] args)
    {
        Test frame = new Test();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
} 
4

1 回答 1

2

默认情况下,选择组合框的第一项,在您的示例中为“红色”。

当您编辑单元格时,在组合框编辑器中选择了 TableModel 中的值。由于表中的数据与组合框中的任何条目都不匹配,因此选择不会更改,因此“红色”显示为编辑器中的值。

当您从编辑器中进行选择时,该值将保存在模型中,并将在您下次编辑单元格时正确显示。

您的问题的解决方案是确保 TableModel 在创建时包含有效数据。只有这样才能选择组合框中的正确项目。

我想我必须将一个动作侦听器附加到组合框以确定要选择的项目

不,当组合框用作编辑器时,您不会在组合框上与侦听器一起玩。组合框编辑器会自动为您选择项目。

于 2013-06-27T16:25:14.580 回答