当前位置: 首页 > 面试题库 >

JComboBox在多个表格单元之间共享,自动选择当前选定的项目

令狐宏浚
2023-03-14
问题内容

我使用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);
    }
}

问题答案:

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

编辑单元格时,将在comboBox编辑器中选择TableModel中的值。由于表中的数据与comboBox中的任何条目都不匹配,因此选择不会更改,因此在编辑器中将“
Red”显示为值。

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

解决您的问题的方法是确保TableModel在创建时包含有效数据。只有这样,才能在comboBox中选择适当的项目。

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

不,当您使用comboBox作为编辑器时,您不会在其上玩监听器。comboBox编辑器会自动为您选择项目。



 类似资料:
  • 问题内容: 即将选择单元格时,是否会触发任何事件?有ListSelectionListener,但是它具有仅在选择发生后才触发的事件。我需要某种方法来取消选择事件,并且使用ListSelectionListener并不容易,因为选择已经发生,并且我需要具有一些状态变量来指示选择是正常的还是取消先前的选择。 有没有办法关闭选择通知?但是,这不是100%好的解决方案(如果某些侦听器将选择状态保存在本地

  • 我有一个Table,我使用我自己的自定义LabelProvider来显示背景和前景颜色。 由此我得出,我无法更改选择的背景色。因此,我想能够改变前景色的文字选择后。但是,我不知道如何检测是否选择了特定的行,以便提供不同的前景色。 任何帮助将不胜感激,我不太精通swt。 编辑:对于任何搜索这是我所做的

  • 问题内容: 我正在尝试使用下面的代码在两个选择列表之间移动项目,但是没有将项目从availableClients列表移动到selectedClients列表,所以有人可以检查下面的代码并让我知道我在这里缺少什么吗?谢谢 控制器: 问题答案: 模板中有几个小问题: 您要将对象从移到,但是第一个选择显示的是从而不是从的选项 您移动的是ID,而不是对象。您的ng-option应该只是 您 删除所有 按钮

  • 这可能是一个骗局——我找不到它——我基本上只是试图通过提供我自己的ListCellRenler来自定义JComboBox显示: 当我展开JComboBox列表时,组件会正确显示名称。但是,在选择项目时,显示将恢复为myObj的toString()值。 我错过什么了吗?

  • 我有一个人[]有三个人(p1,p2,p3)。Person类有两个属性name和email。 我使用了以下代码。 但我不想这样用。我想使用两个组合框与相同的型号。我尝试使用DefaultComboBoxModel并重写getElementAt()方法,如下所示。 } 问题是如何使用相同的ComboBoxModel在一个JComboBox中添加Person[]的所有名称,并在另一个JComboBox中

  • 我正准备在debian系统上构建加密库,尽管debian存储库通过apt get提供它们,但我想从源代码处这样做,以确保编译的库是最新的库,并且只使用某些选项进行构建。 默认的makefile被配置为构建一个静态库,发布build,我想根据自己的需要修改makefile,并在那里添加一些其他东西。 基本上,我只会将这些库用于学习,没有任何形式的发布程序,所以我的问题是我是否需要发布构建或调试来学习