JTable,JComboBox使用自定义对象 [英] JTable, JComboBox using custom Objects

查看:103
本文介绍了JTable,JComboBox使用自定义对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,如果你把JTCom和String []数组中的JComboBox放到JComboBox,一切正常。如果您将自己的数据类型添加到JComboBox,则选择同一列中的值变得复杂。这是官方示例。尝试更改以下部分:

Hi if You put JComboBox in JTable and String[] array to JComboBox everything works fine. Buf if You put your own data type to JComboBox selecting values in same column becomes complicated. Here is official example. Try changing following part:

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

进入:

JComboBox comboBox = new JComboBox();
comboBox.addItem(new Test("Snowboarding"));
comboBox.addItem(new Test("Rowing"));
comboBox.addItem(new Test("Knitting"));
comboBox.addItem(new Test("Speed reading"));
comboBox.addItem(new Test("Pool"));
comboBox.addItem(new Test("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;
    }
}

你会看到,当你点击表格单元格时在女巫中有JComboBox具有自定义数据类型。自动选择第一列单元格的值。如何解决这个问题?

You will see, that when you click on table cell in witch there is JComboBox with custom data type. First column cell's value get's selected automaticlly. How to fix this issue?

编辑1:我添加了SSCCE。

EDIT 1: I added 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);
    }

}

渲染器:

import java.awt.Component;

import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class Renderer extends JComboBox implements TableCellRenderer {
    public Renderer(String[] items) {
        super(items);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            super.setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }

        // Select the current value
        setSelectedItem(value);
        return this;
    }
}


推荐答案

问题是你的TableModel存储一个String对象,而ComboBox包含一个Test对象。这些对象不相等,因此没有要选择的项目,它看起来第一个会自动突出显示。

The problem is that your TableModel is storing a String object and the ComboBox contains a Test object. These objects are not equal so there is no item to select and it looks the first is automatically highlighted.

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

Change your code to the following and you will see the same problem with an unknown string:

{"Joe", "Brown", "Pool?????", new Integer(10), new Boolean(false)}

为了解决这个问题,我猜你需要这样做以下:

To fix the problem, I would guess you need to do the following:

{"Joe", "Brown", new Test("Pool"), new Integer(10), new Boolean(false)}

然后,您需要在Test类中实现equals()方法比较两个组件的name属性。同样,你需要实现hashcode()方法。

You would then need to implement the equals() method in your Test class to compare the name property of both components. As well, you would need to implement the hashcode() method.

将来,正如安德鲁建议的那样,请将你的SSCCE包含在你的问题中,因为我们没有时间复制/粘贴/编辑和测试代码,因为我们永远不会知道我们是否完全按照您的方式执行此操作。

In the future, as Andrew suggested, include your SSCCE with your question as we don't have time to copy/paste/edit and test code because we never know if we do it exactly the same way you do.

这篇关于JTable,JComboBox使用自定义对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆