我想知道为什么我的jTable没有排序百分比值以及如何解决这个问题? 我希望我可以将整行转换为字符串,但仍然无法正常工作。 我究竟做错了什么? 感谢
package tables;
import java.awt.BorderLayout;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class mainwindow extends JPanel
{
private static final long serialVersionUID = 1L;
private static Object data[][];
public static void main(String[] args)
{
DecimalFormat round = new DecimalFormat("#.#");
JFrame testFrame = new JFrame();
testFrame.setTitle("table");
testFrame.setLayout(new BorderLayout());
data = new Object[30][3];
String test = null;
for (int i = 0; i < 30; i ++)
{
test = (String) (round.format(100 * new Double((double) i / 9)))+ "%"; // dummy values
data[i][0] = test;
data[i][1] = "a";
data[i][2] = "a";
}
Object[] columns =
{"Track #", "Title", "Length"};
DefaultTableModel model = new DefaultTableModel(data,columns)
{
private static final long serialVersionUID = 1L;
};
JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
table.setAutoCreateRowSorter(true);
testFrame.add(scroll,BorderLayout.CENTER);
testFrame.pack();
testFrame.setVisible(true);
}
}
答案 0 :(得分:1)
调用table.setAutoCreateRowSorter(true)
意味着在表模型发生变化时会创建一个RowSorter(它在JavaDoc中!)。由于模型永远不会更改,因此不会创建RowSorter。在table.setModel(model)
之后添加对table.setAutoCreateRowSorter(true)
的电话。
你需要告诉表格它的数据是Double对象,而不是字符串 - 因为你想像双打一样对它们进行排序,只显示为字符串。
将数组中的数据设置为Double对象:
data[i][0] = new Double(i);
然后编辑表格模型:
DefaultTableModel model = new DefaultTableModel(data, columns) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int col) {
if (col == 0) {
return Double.class;
}
return String.class;
}
};
现在为第一列实现自定义单元格渲染器:
JTable table = new JTable(model);
class PercentRenderer extends javax.swing.table.DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable itable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel oLabel = (JLabel) super.getTableCellRendererComponent(itable, value, isSelected, hasFocus, row, column);
if (value instanceof Double) {
oLabel.setText(round.format(100. * (double) value) + "%");
}
return oLabel;
}
}
table.getColumnModel().getColumn(0).setCellRenderer(new PercentRenderer());
答案 1 :(得分:1)
不是在String
中存储TableModel
,而是存储Double
。使用custom renderer将值格式化为百分比,如完整example所示。而不是
private NumberFormat nf = NumberFormat.getCurrencyInstance();
使用
private NumberFormat nf = NumberFormat.getPercentInstance();
通过这种方式,您的RowSorter
可以依赖Double
的自然排序顺序。