gpt4 book ai didi

java - 如何对JTable中JComboBox的字符串进行排序?

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:39 24 4
gpt4 key购买 nike

我有以下问题:

我已在 JTable 的第五列中为每一行插入了一个 JComboBox-Object。一切都很好,直到我想使用 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;

}

}

TableCell渲染器:

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() 方法返回 JCombobox.class-对象。

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

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

希望这对遇到类似问题的人有所帮助......

最佳答案

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

您永远不应该在 TableModel 中实际存储 JComboBox。如果您实际上正在这样做,那么就摆脱它。

然后去掉你的自定义比较器,它应该可以正常工作。

如果您尝试对不同行中的组合框使用不同的值,那么您应该尝试类似:how to add different cell editors for one column in JTable?

关于java - 如何对JTable中JComboBox的字符串进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28788089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com