刚学JAVA不久,发现java自己封装了排序的一个类,本以为使用很方便,可是发现它返回的类型总是不太合适。现在我要将其改为int类型,太清楚具体改法,望指教。
原来的写法,只是实现排序//重写前
model = new DefaultTableModel(null, names);
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
后来上网找说是只要重写这个类中的getColumnClass就好,可现在好像有些问题了就//重写后
model = new DefaultTableModel(null, names)
{
public Class getColumnClass(int names) {
Class returnValue;
if ((names >= 0) && (names < getComponentCount())) {
returnValue = getValueAt(0, names).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
现在运行也有错误,returnValue = getValueAt(0, names).getClass();这句有错误,是改了值类型问题?而且后面像JTable填充数据时类型该怎么选?
我现在的需求就是按照每列自己的类型排序,比如有全是String类型,就还那么排;有int类型就按int排;这样是不是要重新自己写排序?监听鼠标单击事件,获得表头,确定该列内容云云的……?
望指教,谢谢
原来的写法,只是实现排序//重写前
model = new DefaultTableModel(null, names);
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
后来上网找说是只要重写这个类中的getColumnClass就好,可现在好像有些问题了就//重写后
model = new DefaultTableModel(null, names)
{
public Class getColumnClass(int names) {
Class returnValue;
if ((names >= 0) && (names < getComponentCount())) {
returnValue = getValueAt(0, names).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
现在运行也有错误,returnValue = getValueAt(0, names).getClass();这句有错误,是改了值类型问题?而且后面像JTable填充数据时类型该怎么选?
我现在的需求就是按照每列自己的类型排序,比如有全是String类型,就还那么排;有int类型就按int排;这样是不是要重新自己写排序?监听鼠标单击事件,获得表头,确定该列内容云云的……?
望指教,谢谢
解决方案 »
- 正则表达式 [\\?/:*|<>\ ] ,url.replaceAll( [\\?/:*|<>\ ] , _ )是什么意思?
- JS调用JQuery方法
- 如何清除MyEclipse内置浏览器地址栏内的地址?
- web系统后台声音提示,一点思路都没有,求帮助!
- web.xml的问题, 谢谢大家帮忙~
- Unable to locate package java.lang in classpath or bootclasspath
- log4j支持把error的信息输出到日志文件,而把info的信息输出到控制台?
- JAVA中的引用问题!
- eclipse中的cvs问题
- com.microsoft.sqlserver.jdbc.SQLServerException: 用户 '谢来' 登录失败。 at com.microsoft
- 用Java连接数据库和简单的数据库操作代码
- 学习JavaEE的步骤
问题:
1. 你是想直接对传入的数据进行排序,还是希望点击某个header来排序?
下面是我的一个测试DemoString[] names = { "aaa", "bbb", "ccc" };
Object[][] data = { { "123", "123", "123" },
{ "111", "123", "123" },
{ "11", "123", "123" },
{ "100", "123", "123" },
{ "20", "123", "123" },
{ "3", "123", "123" },
};
model = new DefaultTableModel(data, names) {
public Class getColumnClass(int names) {
Class returnValue;
if ((names >= 0) && (names < getComponentCount())) {
returnValue = getValueAt(0, names).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
sorter = new TableRowSorter<DefaultTableModel>(model);
tab1 = new JTable(model);
tab1.setRowSorter(sorter);
点击header后并没有按照int排序,第一列依旧排序不对;是不是我没有调用我重写的这个类?
import javax.swing.*;
import javax.swing.table.*;import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Dimension;public class TableExample3 { public TableExample3() {
JFrame frame = new JFrame("Table");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}}); // Take the dummy data from SwingSet.
final String[] names = {"First Name", "Last Name", "Favorite Color",
"Favorite Number", "Vegetarian"};
final Object[][] data = {
{"Mark", "Andrews", "Red", new Integer(2), Boolean.TRUE},
{"Tom", "Ball", "Blue", new Integer(99), Boolean.FALSE},
{"Alan", "Chung", "Green", new Integer(838), Boolean.FALSE},
{"Jeff", "Dinkins", "Turquois", new Integer(8), Boolean.TRUE},
{"Amy", "Fowler", "Yellow", new Integer(3), Boolean.FALSE},
{"Brian", "Gerhold", "Green", new Integer(0), Boolean.FALSE},
{"James", "Gosling", "Pink", new Integer(21), Boolean.FALSE},
{"David", "Karlton", "Red", new Integer(1), Boolean.FALSE},
{"Dave", "Kloba", "Yellow", new Integer(14), Boolean.FALSE},
{"Peter", "Korn", "Purple", new Integer(12), Boolean.FALSE},
{"Phil", "Milne", "Purple", new Integer(3), Boolean.FALSE},
{"Dave", "Moore", "Green", new Integer(88), Boolean.FALSE},
{"Hans", "Muller", "Maroon", new Integer(5), Boolean.FALSE},
{"Rick", "Levenson", "Blue", new Integer(2), Boolean.FALSE},
{"Tim", "Prinzing", "Blue", new Integer(22), Boolean.FALSE},
{"Chester", "Rose", "Black", new Integer(0), Boolean.FALSE},
{"Ray", "Ryan", "Gray", new Integer(77), Boolean.FALSE},
{"Georges", "Saab", "Red", new Integer(4), Boolean.FALSE},
{"Willie", "Walker", "Phthalo Blue", new Integer(4), Boolean.FALSE},
{"Kathy", "Walrath", "Blue", new Integer(8), Boolean.FALSE},
{"Arnaud", "Weber", "Green", new Integer(44), Boolean.FALSE}
}; // Create a model of the data.
TableModel dataModel = new AbstractTableModel() {
// These methods always need to be implemented.
public int getColumnCount() { return names.length; }
public int getRowCount() { return data.length;}
public Object getValueAt(int row, int col) {return data[row][col];} // The default implementations of these methods in
// AbstractTableModel would work, but we can refine them.
public String getColumnName(int column) {return names[column];}
public Class getColumnClass(int col) {return getValueAt(0,col).getClass();}
public boolean isCellEditable(int row, int col) {return (col==4);}
public void setValueAt(Object aValue, int row, int column) {
data[row][column] = aValue;
}
}; // Instead of making the table display the data as it would normally with:
// JTable tableView = new JTable(dataModel);
// Add a sorter, by using the following three lines instead of the one above.
TableSorter sorter = new TableSorter(dataModel);
JTable tableView = new JTable(sorter);
sorter.addMouseListenerToHeaderInTable(tableView); JScrollPane scrollpane = new JScrollPane(tableView); scrollpane.setPreferredSize(new Dimension(700, 300));
frame.getContentPane().add(scrollpane);
frame.pack();
frame.setVisible(true);
} public static void main(String[] args) {
new TableExample3();
}
}jdk1.5.0\demo\jfc\TableExample\src
参考下吧