gpt4 book ai didi

java - JTable 渲染器无法与 RowSorter 一起使用?

转载 作者:行者123 更新时间:2023-12-02 06:49:24 27 4
gpt4 key购买 nike

我有一个简单的 JTable,第一列保存整数,第二列保存字符串。我希望能够对每一列进行排序。

我的渲染器:

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

}

我的表模型:

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

如果我不实现 getColumnClass,则渲染器工作正常,但整数将按字符串排序。一旦我实现该方法,渲染器就无法正常工作(背景仅在一列中设置),但整数已正确排序。我该如何解决这个问题?

我设置渲染器和排序器的代码:

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

有什么想法吗?谢谢。

最佳答案

缺少 sscce , two 有几件事很突出:

  1. setDefaultRenderer() 的调用应指定其适用的数据类型,例如String.classInteger.class。或者,重写表的 prepareRenderer() 以考虑所有单元格,如下所示 here .

    reporttable.setDefaultRenderer(Integer.class, new StandardCellRenderer());
  2. 您的 TableRowSorter 构造函数“使用空模型创建一个 TableRowSorter”。相反,请将您的 TableModel 传递给构造函数或使用 setAutoCreateRowSorter(true)

    reporttable.setAutoCreateRowSorter(true);
  3. “使用排序器时,请始终记住翻译单元格坐标”,如所讨论的 here .

关于java - JTable 渲染器无法与 RowSorter 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18230654/

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