gpt4 book ai didi

Java 比较器总是将值读取为字符串

转载 作者:行者123 更新时间:2023-12-01 18:43:58 24 4
gpt4 key购买 nike

在试图找出我提出的另一个问题( How to sort a jtable with null values always at the end )的答案时,我遇到了另一个问题。

我正在实现一个自定义TableRowSorter,它创建一个自定义Comparator。然而,Comparator 似乎总是将每个 Object 读取为 String 类型。这让我很困惑。

如果您在下面的 SSCCE 中注意到,该行

System.out.println(o1.getClass() + " - " + o2.getClass());

总是产生输出

class java.lang.String - class java.lang.String

即使Object[][]数据数组中的项目有多种类型。

import java.awt.Component;
import java.util.Comparator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Test {

public static void main(String args[]) {
JFrame frame = new JFrame();
JTable table = new JTable();
Object[][] data = new Object[8][3];
data[0][0] = 6.5d; data[0][1] = "Name1";
data[1][0] = new NullClassFiller(); data[1][1] = "Name2";
data[2][0] = 2.6d; data[2][1] = "Name3";
data[3][0] = 0d; data[3][1] = "Name4";
data[4][0] = new NullClassFiller(); data[4][1] = "Name5";
data[5][0] = -4d; data[5][1] = "Name6";
data[6][0] = 0d; data[6][1] = "Name7";
data[7][0] = -4.3d; data[7][1] = "Name8";
table.setModel(new DefaultTableModel(data, new String[]{"One", "Two"}));

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()) {
@Override
public Comparator<?> getComparator(final int column) {
Comparator c = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
System.out.println(o1.getClass() + " - " + o2.getClass());
if (o1 instanceof NullClassFiller) {
return -1;
} else if (o2 instanceof NullClassFiller) {
return -1;
} else {
return ((Comparable<Object>) o1).compareTo(o2);
}

}
};
return c;
}
};
table.setRowSorter(sorter);
table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer());
JScrollPane pane = new JScrollPane(table);
frame.add(pane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

static class NullClassFiller {}

static class CustomRenderer extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

if(value instanceof NullClassFiller)
renderer.setText("");

return renderer;
}

}
}

最佳答案

有许多复合问题......

第一个是 DefaultTableModelDefaultTableModel#getColumnClass返回Object.class .

第二个是 TableRowSorterTableRowSorter检查 Class 是否从模型返回的是 Comparable ,如果不是,则自动转换为 String ,因为Object不是Comparable ...

所以,基本的解决方案是覆盖 getColumnClass DefaultTableModel的返回适当类型的 Class特定列的

TableModel model = new DefaultTableModel(data, new String[]{"One", "Two"}) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnIndex == 0 ? Double.class : String.class;
}
};
table.setModel(model);

TableRowSorter检查列的 Class现在它会找到 Comparable值并将使用表模型中的实际值,而不是将其转换为 String首先。

现在,当您尝试对第一列进行排序时,您应该会看到类似的内容......

class testtablesort.TestTableSort$NullClassFiller) - class java.lang.Double
class java.lang.Double) - class testtablesort.TestTableSort$NullClassFiller
class java.lang.Double) - class java.lang.Double
class testtablesort.TestTableSort$NullClassFiller) - class java.lang.Double
class java.lang.Double) - class testtablesort.TestTableSort$NullClassFiller
class java.lang.Double) - class java.lang.Double
class java.lang.Double) - class java.lang.Double
class java.lang.Double) - class testtablesort.TestTableSort$NullClassFiller
class java.lang.Double) - class java.lang.Double
class java.lang.Double) - class java.lang.Double
class java.lang.Double) - class java.lang.Double
class java.lang.Double) - class java.lang.Double

关于Java 比较器总是将值读取为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680682/

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