По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .
Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.
Таким образом, вы можете избежать случаев NullReferenceException
, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X
в классе, а затем попытаетесь вызвать один из его методов, а X
имеет нулевое значение, то это приведет к NullReferenceException
:
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
По этой причине Код Контракт существует для приложений .NET.
В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .
ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .
Попробуйте этот небольшой пример.
[/g2]
Как было предложено Kleopatra, определение класса столбца, относящегося к каждый из них будет достаточным для правильной сортировки данных.
import javax.swing.*;
import javax.swing.table.*;
import java.util.Comparator;
class TableSorting {
public static void main(String[] args) {
Object[][] data = {
{new Integer(1), "Don't Let Go", new Integer(179)},
{new Integer(2), "Photograph", new Integer(29)},
{new Integer(3), "Hash Pipe", new Integer(186)},
{new Integer(4), "Island In The Sun", new Integer(200)},
{new Integer(5), "Crab", new Integer(154)},
{new Integer(6), "Knock-Down Drag-Out", new Integer(128)},
{new Integer(7), "Smile", new Integer(158)},
{new Integer(8), "Simple Pages", new Integer(176)},
{new Integer(9), "Glorious Day", new Integer(160)},
{new Integer(10), "O Girlfriend", new Integer(230)}
};
Object[] columns = {"Track #", "Title", "Length"};
DefaultTableModel model = new DefaultTableModel(data,columns) {
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Integer.class;
case 1:
return String.class;
case 2:
return Integer.class;
default:
return String.class;
}
}
};
JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
table.setAutoCreateRowSorter(true);
JOptionPane.showMessageDialog(null, scroll);
}
}
import javax.swing.*;
import javax.swing.table.*;
import java.util.Comparator;
class TableSorting {
public static void main(String[] args) {
Object[][] data = {
{new Integer(1), "Don't Let Go", new Integer(179)},
{new Integer(2), "Photograph", new Integer(29)},
{new Integer(3), "Hash Pipe", new Integer(186)},
{new Integer(4), "Island In The Sun", new Integer(200)},
{new Integer(5), "Crab", new Integer(154)},
{new Integer(6), "Knock-Down Drag-Out", new Integer(128)},
{new Integer(7), "Smile", new Integer(158)},
{new Integer(8), "Simple Pages", new Integer(176)},
{new Integer(9), "Glorious Day", new Integer(160)},
{new Integer(10), "O Girlfriend", new Integer(230)}
};
Object[] columns = {"Track #", "Title", "Length"};
JTable table = new JTable(data, columns);
JScrollPane scroll = new JScrollPane(table);
DefaultTableModel model = new DefaultTableModel(data,columns);
TableRowSorter trs = new TableRowSorter(model);
class IntComparator implements Comparator {
public int compare(Object o1, Object o2) {
Integer int1 = (Integer)o1;
Integer int2 = (Integer)o2;
return int1.compareTo(int2);
}
public boolean equals(Object o2) {
return this.equals(o2);
}
}
trs.setComparator(0, new IntComparator());
table.setRowSorter(trs);
scroll = new JScrollPane(table);
table.setAutoCreateRowSorter(false);
JOptionPane.showMessageDialog(null, scroll);
}
}
Вот ответ: Проблемы с сортировкой JTable целых значений
Идея состоит в том, чтобы определить классы для столбцов.
myTable.setModel(new DefaultTableModel(Object[][] tableData, String[] columnsNames){
Class[] types = { Boolean.class, Boolean.class, String.class, String.class };
@Override
public Class getColumnClass(int columnIndex) {
return this.types[columnIndex];
}
});
Ну, в документах для DefaultTableModel указывается:
Warning: DefaultTableModel возвращает класс столбца объекта. Когда DefaultTableModel используется с TableRowSorter, это приведет к широкому использованию toString, который для типов данных, отличных от String, является дорогостоящим. Если вы используете DefaultTableModel с TableRowSorter, вам настоятельно рекомендуется переопределить getColumnClass, чтобы вернуть соответствующий тип.
blockquote>. Похоже, что это просто преобразование значений в строки, что согласуется с что вы видите.
Вы пытались либо переопределить
getColumnClass()
, либо вызватьsetComparator()
для соответствующегоTableRowSorter
?