当前位置: 首页 > 知识库问答 >
问题:

如何在JTables中对JComboBoxs的字符串进行排序?

戚永福
2023-03-14

我在JTable的第5列中为每行插入了一个JComboBox-Object。在我想使用setAutoCreaterowSorter(true)对列进行行排序之前,一切都很好。在这种情况下,我得到以下异常:

ClassCastException: java.lang.String cannot be cast to javax.swing.JComboBox

下面是我在JTable中使用的类:

TableModel:

private class MyTableModel implements TableModel {

        @Override
        public void addTableModelListener(TableModelListener l) {
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {

            switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return Number.class;
            case 4:
                return Boolean.class;
            case 5:
                return JComboBox.class;  // modifyed!

            default:
                return null;
            }

        }

        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public String getColumnName(int columnIndex) {
            return columnNames[columnIndex];
        }

        @Override
        public int getRowCount() {
            return data[0].length - 1;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return data[rowIndex][columnIndex];

        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            switch (columnIndex) {
            case 5:
                return true;
            default:
                return false;
            }

        }

        @Override
        public void removeTableModelListener(TableModelListener l) {
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            data[rowIndex][columnIndex] = aValue;

        }

    }
public class StringTableCellRenderer extends JLabel implements
        TableCellRenderer {

    private static final long serialVersionUID = 1L;

    public StringTableCellRenderer() {
        setOpaque(true);
        setLayout(new BorderLayout());
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Font font = getFont().deriveFont(Font.BOLD, 15);

        if ((row % 2) == 0) {
            setBackground(new Color(240, 255, 255));
        } else {
            setBackground(new Color(191, 239, 255));
        }

        if (isSelected) {
            setBackground(new Color(0, 191, 255));
        }

        setHorizontalAlignment(JLabel.CENTER);
        setForeground(Color.BLACK);
        setFont(font);

        if (value instanceof JComboBox) {
            System.out.println("Renderer: "+column+" "+row+" "+((JComboBox<?>)value).getSelectedIndex());

            setText((String) ((JComboBox<?>) value).getSelectedItem());
        } else {
            setText(value.toString());
        }

        return this;
    }

}
  public class MyTableCellEditor extends AbstractCellEditor implements
        TableCellEditor, ActionListener {

    private static final long serialVersionUID = 1L;
    private JComboBox<?>[] comboList = new JComboBox<?>[5];
    private int column = 0;

    @SuppressWarnings("unchecked")
    public MyTableCellEditor() {

        for (int i = 0; i < comboList.length; i++) {
            comboList[i] = new JComboBox<String>();
            setComboBox((JComboBox<String>) comboList[i]);
            comboList[i].setName("ComboBox_" + i);
        }

    }

    public void setComboBox(JComboBox<String> comboBox) {
        comboBox.addItem("Me");
        comboBox.addItem("You");
        comboBox.addItem("They");
        comboBox.addItem("Us");
        comboBox.addItem("We");
    }

    @Override
    public void actionPerformed(ActionEvent event) {
    }

    @Override
    public Object getCellEditorValue() {
        System.out.println("Editor: getCellEditorValue() "+comboList[column].getSelectedIndex());
        if (comboList[column].getSelectedIndex()==-1) {
            return (String) comboList[column].getItemAt(0);
        } else {
            return (String) comboList[column].getSelectedItem(); // returns String not JCombobox!
        }
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {

        String fieldValue = null;
        System.out.println("Editor: getTableCellEditorComponent");
        if (value instanceof JComboBox<?>) {
            fieldValue = (String) ((JComboBox<?>) value).getSelectedItem();
        }
        this.column = column - 1;
        comboList[column - 1].setSelectedItem(fieldValue);

        return comboList[column - 1]; // for each row of column 5 an own JComboBox object

    }

}

在TableModel中,列5的getColumnClass()-method返回JComboBox.class-Object。

在TableCellEditor中,第5列中的每一行都有自己的JComboBox-对象,而GetCelleDitorValue()-方法返回相关JComboBox-对象的GetSelectedItem()

因此Jtable确实有一个JComboBox-Object(GetValueat()-Method for column 5 from TableModel和GetTableCelleDitorComponent()-Method for TableCelditor),但返回值仍然是一个字符串(getCellEditorValue()from TableCellRendererComponent()-Method from TableCellRenderer)。

希望这能帮助任何有类似问题的人...

共有1个答案

奚瑾瑜
2023-03-14

为什么要创建自定义比较器?TableModel中的数据是字符串数据,而不是JComboBox。表的RowSorter已经知道如何对字符串数据进行排序。

您不应该实际将JComboBox存储在TableModel中。如果你真的这么做了,那就摆脱它吧。

然后摆脱您的自定义比较器,它应该可以很好地工作。

 类似资料:
  • 问题内容: 我有被随机放入的。 例如: 考虑到您无法控制输入的事实(即,进入ArrayList的字符串是随机的;以任何顺序排列的斑马或龙),一旦ArrayList充满了输入,我如何按字母顺序对它们进行排序(不包括第一个)? 很好 排序按字母顺序排列。 问题答案: 上面的代码将反映已排序原始列表的 实际子 列表。

  • 请检查上面的结果输出。如您所见,在之后,它显示。但是我需要显示而不是。我尝试了两种方法,但结果是一样的。 已经检查了以下问题, MySQL排序字符串号 从VARCHAR强制转换为int-MySQL

  • 本文向大家介绍如何在Python中对字符串列表进行排序?,包括了如何在Python中对字符串列表进行排序?的使用技巧和注意事项,需要的朋友参考一下 要对列表进行排序,即对列表本身进行排序并更改列表本身的顺序,可以在字符串列表中使用。例如, 如果要保持原始列表不变,而要一个新的排序元素列表,则可以使用sorted(list)。例如,        

  • 我在API文档中看到上有一个方法,但我不清楚参数需要什么。目前的需要是一个非常简单的直接向上的阿尔法比较。

  • 问题内容: 我在排序包含整数的字符串时遇到问题。如果使用下面的代码,我将进行排序:1some,2some,20some,21some,3some,一些 但是我希望将其排序为:1some,2some,3some,20some,21some,一些 我怎样才能做到这一点? 谢谢! 问题答案: 这是有关如何执行此操作的独立示例(未特别优化): 输出量 说明 该示例使用一个常数来推断数字是否位于的起始位置。

  • 问题内容: 我想对具有nr的字符串进行排序。我怎么做? 可以说我的整数是 在主要我做class2.Sort(); 提前致谢。 问题答案: