[英]JTable Renderer not working with RowSorter?
I have a Simple JTable holding Integers in the first column and Strings in the Second. 我有一个简单的JTable在第一列中保存整数,在第二列中保存字符串。 I would like to be able to sort each Column. 我希望能够对每个列进行排序。
My Renderer: 我的渲染器:
package gui.table;
import gui.DaimlerColor;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
@SuppressWarnings("serial")
public class StandardCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setBackground((isSelected ? DaimlerColor.LIGHT_BLUE : (row % 2 == 1 ? DaimlerColor.DARK_WHITE : DaimlerColor.WHITE)));
if(isSelected){
c.setBackground(DaimlerColor.LIGHT_BLUE);
}
return c;
}
} }
My TableModel: 我的TableModel:
package gui.table;
import java.util.List;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import org.jdom2.Element;
import reporting.FailureClassificationCatalogue;
@SuppressWarnings("serial")
public class ReportTableModel extends DefaultTableModel {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
public ReportTableModel(List<Element> reports) {
super(createDataVector(reports), createColumnNames());
}
private static Vector<Vector<Object>> createDataVector(List<Element> reports) {
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
for (int i = 0; i < reports.size(); i++) {
Vector<Object> row = new Vector<Object>();
if(reports.get(i).getName().equals("Default")){
row.add("-");
}
else{
row.add(Integer.valueOf(i+1));
}
String title = reports.get(i).getAttributeValue("type");
try{
title = FailureClassificationCatalogue.valueOf(title).getName();
}catch(IllegalArgumentException iae){
}catch(NullPointerException npe){
}
row.add(title);
data.add(row);
}
return data;
}
@Override
public Class<?> getColumnClass(int colNum) {
switch (colNum) {
case 0:
return Integer.class;
case 1:
return String.class;
default:
return String.class;
}
}
private static Vector<String> createColumnNames() {
Vector<String> columns = new Vector<String>();
columns.add("Number");
columns.add("Error Type");
return columns;
}
/**
* overridden to ignore null values
*/
@Override
public void setValueAt(Object value, int row, int col) {
if (value == null) {
return;
}
// delegate to the parent method
super.setValueAt(value, row, col);
}
}
If I don´t implement the getColumnClass then the renderer works fine but the Integers are sorted as Strings. 如果我没有实现getColumnClass,那么渲染器工作正常,但整数被排序为字符串。 As soon as I implement the method the renderer doesn´t work properly (background is only set in one column) but the Integers are sorted correctly. 一旦我实现了该方法,渲染器就无法正常工作(后台仅在一列中设置),但整数正确排序。 How can I resolve this? 我该如何解决这个问题?
My Code to set the renderer and sorter: 我的代码设置渲染器和分拣机:
reporttable = new JTable();
reporttable.setName("report");
reporttable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
reporttable.setRowHeight(40);
reporttable.addMouseListener(tgc.mouseListener);
reporttable.setDefaultRenderer( Object.class, new StandardCellRenderer());
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
reporttable.setRowSorter(sorter);
sorter.setModel(reportModel);
Any ideas? 有任何想法吗? Thanks. 谢谢。
Absent an sscce ,
two
several things stand out: 没有sscce ,有
两
件事突出:
The call to setDefaultRenderer()
should specify the data type to which it applies, eg String.class
or Integer.class
. 对setDefaultRenderer()
的调用应指定它应用的数据类型,例如String.class
或Integer.class
。 Alternatively, override the table's prepareRenderer()
to consider all cells, as shown here . 另外,覆盖表的prepareRenderer()
考虑所有的细胞,如图所示这里 。
reporttable.setDefaultRenderer(Integer.class, new StandardCellRenderer());
Your TableRowSorter
constructor "Creates a TableRowSorter
with an empty model." 您的TableRowSorter
构造函数“使用空模型创建TableRowSorter
”。 Instead, pass your TableModel
to the constructor or use setAutoCreateRowSorter(true)
. 相反,将TableModel
传递给构造函数或使用setAutoCreateRowSorter(true)
。
reporttable.setAutoCreateRowSorter(true);
"When using a sorter, always remember to translate cell coordinates," as discussed here . “在使用分拣机,永远记住翻译单元坐标,”为讨论在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.