Java JTable,使用自定义对象的JComboBox

Java JTable,使用自定义对象的JComboBox,java,swing,jtable,jcombobox,Java,Swing,Jtable,Jcombobox,您好,如果您将JComboBox放入JTable,并将String[]数组放入JComboBox,则一切正常。Buf若您将自己的数据类型放入JComboBox,在同一列中选择值会变得复杂。这是。尝试更改以下部分: JComboBox comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); comboBox.addItem("Knitting"); comboBox.addI

您好,如果您将JComboBox放入JTable,并将String[]数组放入JComboBox,则一切正常。Buf若您将自己的数据类型放入JComboBox,在同一列中选择值会变得复杂。这是。尝试更改以下部分:

JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Knitting");
comboBox.addItem("Speed reading");
comboBox.addItem("Pool");
comboBox.addItem("None of the above");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
进入:

并创建新的数据类型:

public class Test {
    private String name;

    public Test(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}
您将看到,当您单击witch中的table cell时,有一个具有自定义数据类型的JComboBox。自动选择第一列单元格的值get。如何解决这个问题

编辑1:我添加了SSCCE

主要类别:

import java.awt.BorderLayout;

public class windw extends JFrame {

    private JPanel contentPane;
    private JTable table;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    windw frame = new windw();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public windw() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();

        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        table = new JTable();
        String[] grupes2 = new String[3];
        grupes2[0] = "first";
        grupes2[1] = "second";
        grupes2[2] = "third";

        table.setModel(new DefaultTableModel(
            new Object[][] {
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
                {new JComboBox<String>(grupes2)},
            },
            new String[] {
                "Column name"
            }
        ));
        TableColumn sportColumn = table.getColumnModel().getColumn(0);
        sportColumn.setCellEditor(new DefaultCellEditor(new JComboBox<String>(grupes2)));
        sportColumn.setCellRenderer(new Renderer(grupes2));
        contentPane.add(table, BorderLayout.CENTER);
    }

}

问题是TableModel存储的是一个String对象,而ComboBox包含一个测试对象。这些对象不相等,因此没有可选择的项目,并且第一个项目看起来会自动高亮显示

将代码更改为以下内容,您将看到未知字符串存在相同的问题:

{"Joe", "Brown", "Pool?????", new Integer(10), new Boolean(false)}
要解决此问题,我想您需要执行以下操作:

{"Joe", "Brown", new Test("Pool"), new Integer(10), new Boolean(false)}
然后,需要在测试类中实现equals()方法来比较两个组件的name属性。此外,还需要实现hashcode()方法


将来,正如Andrew所建议的,将您的SSCE包括在您的问题中,因为我们没有时间复制/粘贴/编辑和测试代码,因为我们永远不知道我们是否以与您完全相同的方式进行操作。

为了更快地获得更好的帮助,请发布一篇文章。也许我问错了,但帮助我的是,当我使用
addRow(new Object[]{})
。以前我是这样添加的-
addRow(新对象[]{”“})
是错误的。谢谢!!!现在我明白了为什么我需要
@Override
equals()
hashCode()
{"Joe", "Brown", "Pool?????", new Integer(10), new Boolean(false)}
{"Joe", "Brown", new Test("Pool"), new Integer(10), new Boolean(false)}