将TableRowSorter添加到表及其对应的模型之后,任何相应的添加都会特别添加firetabletablerowsinserted导致异常.从测试中可以清楚地看出,GetRowCount()返回的值超出了模型范围.但是,添加分拣机或过滤器后,如何继续向表中添加值对我没有意义?
作为一个例子,我在向表中添加任何内容之前设置行过滤器,然后在我的模型中使用以下调用向表中添加一个值:
this.addRow(row, createRow(trans,row));
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)
rowcount的大小为1,抛出异常:
java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at com.gui.model
Run Code Online (Sandbox Code Playgroud)
如果我在没有先添加分拣机的情况下执行相同的步骤,一切都很好.我假设我可能需要通知模型分拣机可能已经进行了更改并尝试了以下但仍然返回异常:
this.addRow(row, createRow(trans,row));
this.fireTableStructureChanged()
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)
我甚至试图通知模型内部的分拣机,在调用fire之前已经将一个值添加到模型中,但是它也失败了:
this.addRow(row, createRow(trans,row));
if(sorter.getRowFilter() != null){
//if a sorter exists we are in add notify sorter
sorter.rowsInserted(getRowCount(), getRowCount());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Run Code Online (Sandbox Code Playgroud)
最后,我对FireTableRowsInsterted(0,0)进行了硬编码,并且不会抛出任何异常.但没有任何东西被添加到表中?所以,我知道这绝对是某种类型的OutOfBounds问题.我看了一遍,似乎无法找到答案.如果有人知道这是如何工作的,那将是非常有帮助的.以下是在jpanel中设置分拣机的代码:
messageTable.setRowSorter(null);
HttpTransactionTableModel m = getTransactionTableModel();
final int statusIndex = m.getColIndex("status");
RowFilter<Object,Object> startsWithAFilter = new RowFilter<Object,Object>() {
public boolean include(Entry<? extends Object, ? extends Object> entry) {
for(char responseCode:responseCodes)
{
if (entry.getStringValue(statusIndex).startsWith(Character.toString(responseCode))) {
return true; …
Run Code Online (Sandbox Code Playgroud) 我正在搜索排序JTable
,我推荐了许多文章,但无法获得最简单的排序方式.我也知道这TableRowSorter
可能会有所帮助,但不知道如何.刚接触JTable
,我在这里创建一个新问题.
我的表结构是这样的
| People | Place | Organisation | Event | Mentions |
_____________________________________________________________
| Ramanuj | India | Tata Consultancy | Party'14 | 500000 |
| Prankster | USA | Microsoft Pvt Ltd | Party'14 | 900000 |
Run Code Online (Sandbox Code Playgroud)
我想要的是根据第4列("提及")对我的表Descending进行排序.如果计数(提及)相同,则应按第1列("人员")排序升序
CSVReader reader = new CSVReader(new FileReader(file));
List<String[]> myEntries = reader.readAll();
String[][] rowData = myEntries.toArray(new String[0][]);
String[] columnNames = { "People", "Place", "Organisation", "Event", "Mentions" };
DefaultTableModel tableModel = new DefaultTableModel(rowData, columnNames);
Run Code Online (Sandbox Code Playgroud) 我发现了很多与此相关的问题,但我没有找到解决我问题的简单方法.
我找不到一种方法来使我的JTable排序正确的Double值.
我扩展AbstractTableModel以接收一个Class数组并返回每列的正确类型:
class TableModelMod extends AbstractTableModel{
private ArrayList data;
private String [] headers;
private Class [] types;
TableModelMod(String [] heads, ArrayList datas, Class [] classes){
headers = heads;
data = datas;
types = classes;
}
...
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else
return types[c];
}
...
Run Code Online (Sandbox Code Playgroud)
然后在我的自定义JTable构造函数中:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
Run Code Online (Sandbox Code Playgroud)
但是在添加行时我遇到了这个错误:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
Run Code Online (Sandbox Code Playgroud)
它在DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
接受大多数数字类型但是Double的方法中失败.
如果我为Double列使用另一个类,我没有错误,但仍然排序不能按预期工作.我试过不同的数字类,但似乎没有正确排序双打:
@Override …
Run Code Online (Sandbox Code Playgroud) 无论如何,在使用创建的jtable中调用自动行分类器
setAutoCreateRowSorter(true);
Run Code Online (Sandbox Code Playgroud)
我试图让它按默认列排序,而无需用户点击列标题.
我有一个JTable
地方,最后一行是聚合所有其他行的总行.当用户单击表上的列标题时,行按该列排序,但总行应始终位于底部.
有没有一种简单的方法来实现这一点TableRowSorter
?
嗨,我试图在JTable中只为一个列使用自定义比较器.我用以下代码完成了这个.问题是这样做会破坏Integer的适当排序.
我有一个JTable,列类是:String | 整数| 整数| 布尔| 布尔
我正在使用的比较器就是这些.第一个使用如何拆分字母和数字之间(或数字和字母之间)的字符串?.
//compare strings being aware of numbers embedded in the string
private static Comparator<String> numberAwareCompare = new Comparator<String>() {
public int compare(String s1, String s2) {
String[] s1Parts = s1.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
String[] s2Parts = s2.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
int i = 0;
while(i < s1Parts.length && i < s2Parts.length){
//if parts are the same
if(s1Parts[i].compareTo(s2Parts[i]) == 0){
++i;
}else{
try{
int intS1 = Integer.parseInt(s1Parts[i]);
int intS2 = Integer.parseInt(s2Parts[i]);
//if the parse works
int diff = …
Run Code Online (Sandbox Code Playgroud) 我对 JTable 有一个非常奇怪的问题。
我将数据从 DB 放入 JTable 中。当用户双击任何单元格时,它会复制用户双击所在行的第一列的单元格内容。到目前为止,它运行完美。
当用户通过单击标题对 JTable 进行排序时,就会出现问题。当表格已排序并且现在当用户双击任何行时,它不会当前存储在该行的第一列上。当 JTable 未排序时,它复制最初存储在该行第一列的内容。
有任何想法吗?
我编写了一个默认表格,如下所示:
public class CustTableRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
try {
Object cellObj = table.getModel().getValueAt(row, 7);
double cellValue = (Double) cellObj;
if (cellValue < 0) {
comp.setBackground(new Color(255, 48, 48));
} else if (cellValue == 0) {
comp.setBackground(new Color(173, 255, 47));
} else {
comp.setBackground(Color.white);
}
if (isSelected) {
comp.setBackground(new Color(71, 60, 139));
TableModel model = table.getModel();
} …
Run Code Online (Sandbox Code Playgroud) 我有一个JTable,我想有时按整数(大小列)排序行,有时候按字符串(文件路径)排序.所以我在谷歌搜索它,我来到这里.我已经知道我要覆盖一个名为getColumnClass的DefaultTableModel方法.所以我在这里链接我的代码.
class Personal_model extends DefaultTableModel{
Personal_model(String[][] s,String[] i){
super(s,i);
}
@Override
public Class<?> getColumnClass(int columnIndex){
if (columnIndex!=2)
return String.class;
else
return Integer.class;
}
}
Run Code Online (Sandbox Code Playgroud)
这里是通过模型'Personal_model'创建表的代码; 我还设置了roworter.但是这一切都不起作用!!!!! 帮帮我吧
modeltable = new Personal_model(data,col);
table = new JTable(modeltable);
table.setRowSorter(new TableRowSorter<Personal_model>(modeltable));
Run Code Online (Sandbox Code Playgroud)
通常情况下,没有我的排序器,所有都是完整的可视化,并且字符串被正确排序(很明显,因为通常它都按字符串排序..)
......它是如何发生的(猜测允许,当然:-)
@Override
public int convertChildIndexToModel(int modelIndex) {
return getRowSorter() != null ? getRowSorter()
.convertRowIndexToView(modelIndex) : modelIndex;
}
@Override
public int convertChildIndexToView(int viewIndex) {
return getRowSorter() != null ? getRowSorter()
.convertRowIndexToModel(viewIndex) : viewIndex;
}
Run Code Online (Sandbox Code Playgroud)
是的,白痴是我;-)