Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JTables中对JComboxes的字符串进行排序?_Java_Sorting_Jtable_Jcombobox - Fatal编程技术网

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

Java 如何在JTables中对JComboxes的字符串进行排序?,java,sorting,jtable,jcombobox,Java,Sorting,Jtable,Jcombobox,我有以下问题: 我在JTable的第5列中为每一行插入了一个JComboBox对象。 在我想使用setAutoCreateRowSorter(true)对列进行行排序之前,一切正常。在这种情况下,我会遇到以下异常: ClassCastException: java.lang.String cannot be cast to javax.swing.JComboBox 以下是我用于JTable的类: 表格模型: private class MyTableModel implements Tabl

我有以下问题:

我在JTable的第5列中为每一行插入了一个JComboBox对象。 在我想使用
setAutoCreateRowSorter(true)
对列进行行排序之前,一切正常。在这种情况下,我会遇到以下异常:

ClassCastException: java.lang.String cannot be cast to javax.swing.JComboBox
以下是我用于JTable的类:

表格模型:

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;

        }

    }
私有类MyTableModel实现TableModel{
@凌驾
公共void addTableModelListener(TableModelListener l){
}
@凌驾
公共类getColumnClass(int columnIndex){
开关(列索引){
案例0:
返回字符串.class;
案例1:
返回字符串.class;
案例2:
返回字符串.class;
案例3:
返回编号.class;
案例4:
返回Boolean.class;
案例5:
返回JComboBox.class;//修改!
违约:
返回null;
}
}
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
公共字符串getColumnName(int columnIndex){
返回columnNames[columnIndex];
}
@凌驾
public int getRowCount(){
返回数据[0]。长度-1;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
返回数据[rowIndex][columnIndex];
}
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
开关(列索引){
案例5:
返回true;
违约:
返回false;
}
}
@凌驾
公共void removeTableModelListener(TableModelListener l){
}
@凌驾
public void setValueAt(对象有效、int行索引、int列索引){
数据[rowIndex][columnIndex]=aValue;
}
}
TableCellRenderer:

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

}
公共类StringTableCellRenderer扩展了JLabel实现
TableCell渲染器{
私有静态最终长serialVersionUID=1L;
公共StringTableCellRenderer(){
set不透明(true);
setLayout(新的BorderLayout());
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
Font=getFont().deriveFont(Font.BOLD,15);
如果((行%2)==0){
挫折背景(新颜色(240、255、255));
}否则{
挫折背景(新颜色(191239255));
}
如果(当选){
挫折背景(新颜色(0191255));
}
设置水平对齐(标记中心);
设置前景(颜色为黑色);
setFont(字体);
if(JComboBox的值实例){
System.out.println(“呈现器:“+列+”+行+”+((JComboBox)值).getSelectedIndex());
setText((字符串)((JComboBox)值).getSelectedItem();
}否则{
setText(value.toString());
}
归还这个;
}
}
TableCellEditor:

  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

    }

}
公共类MyTableCellEditor扩展了AbstractCellEditor实现
TableCellEditor,ActionListener{
私有静态最终长serialVersionUID=1L;
私有JComboBox[]组合列表=新JComboBox[5];
私有int列=0;
@抑制警告(“未选中”)
公共MyTableCellEditor(){
for(int i=0;i
我自己解决了这个问题:

在TableModel中,第5列的
getColumnClass()
-方法返回
JCombobox.class
-对象

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

因此,Jtable确实有一个
JComboBox
-对象(
getValueAt()
-TableModel中第5列的方法和
getTableCellEditorComponent()
-TableCellEditor中的方法),但返回值仍然是一个字符串(TableCellEditor和TableCellEditor中的getCellEditorValue())
getTableCellRenderComponent()
-来自TableCellRenderer的方法)


希望这能帮助有类似问题的人…

为什么要创建自定义比较器?这个