我对Java有点陌生,我在使用JTable和TableCellRenderer时遇到了问题。
我有一个表,其中15列填充了值,在某些列上,我使用TableCellRenderer将前景的颜色根据单元格上的值更改为绿色或红色。
一切都很完美,直到我尝试按某一列排序(排序部分没有问题).问题是,形成的颜色不能反映排序操作所做的更改。在排序之前,颜色在表上的原始位置保持不变。有什么简单的方法可以克服这个问题吗?
我搜索了一下,但没有找到我能实现的解决方案。
提亚
JL
编辑:发布的相关源代码(未完成实现)
private void buildTab(){
myIUserInterface.removeBottomTab("just a test");
myJPanel = myIUserInterface.getBottomTab("just a test");
myJScollPane = new JScrollPane();
myTable = new JTable();
myTable.setAutoCreateRowSorter(true);
myTableContent = myFillTableData();
String[] tableHeaders = {
"X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15"
};
myTable.setModel(new DefaultTableModel(myTableContent, tableHeaders) {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
});
MyChangeCellColor myCCC = new MyChangeCellColor();
Enumeration<TableColumn> allColumns = myTable.getColumnModel().getColumns();
while(allColumns.hasMoreElements()){
TableColumn column = allColumns.nextElement();
column.setCellRenderer(myCCC);
}
myJScollPane.setViewportView(myTable);
GroupLayout myLayout = new GroupLayout(myJPanel);
myJPanel.setLayout(myLayout);
myLayout.setHorizontalGroup(
myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 890, Short.MAX_VALUE)
);
myLayout.setVerticalGroup(
myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE)
);
}
class MyChangeCellColor extends JLabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setHorizontalAlignment(CENTER);
setOpaque(true);
setBackground(Color.WHITE);
if (column == 0){
setForeground(Color.BLACK);
}
if (column == 1){
setForeground(Color.BLACK);
}
if (column == 2){
setForeground(Color.BLACK);
}
if (column == 3){
setForeground(Color.BLACK);
}
if (column == 4){
if ("LONG".equals(myTable.getModel().getValueAt(row, 4))) {
setForeground(Color.GREEN.darker());
}
if ("SHORT".equals(myTable.getModel().getValueAt(row, 4))) {
setForeground(Color.RED);
}
}
if (column == 5){
setForeground(Color.BLACK);
}
if (column == 6){
setForeground(Color.BLACK);
}
if (column == 7){
setForeground(Color.BLACK);
}
if (column == 8){
setForeground(Color.BLACK);
}
if (column == 9){
setForeground(Color.BLACK);
}
if (column == 10){
setForeground(Color.BLACK);
}
if (column == 11){
double d = Double.valueOf(myTable.getModel().getValueAt(row, 11).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 12){
double d = Double.valueOf(myTable.getModel().getValueAt(row, 12).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 13){
setForeground(Color.BLACK);
}
if (column == 14){
setForeground(Color.BLACK);
}
setText(value.toString());
return this;
}
}编辑2:解决方案喜欢和粘贴,以供参考,如果有人需要!只需要引用JTable在TableCellRenderer类上返回的行上的模型行(不确定是否正确解释了,您可以看到下面的更改):
class MyChangeCellColor extends JLabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setHorizontalAlignment(CENTER);
setOpaque(true);
setBackground(Color.WHITE);
if (column == 0){
setForeground(Color.BLACK);
}
if (column == 1){
setForeground(Color.BLACK);
}
if (column == 2){
setForeground(Color.BLACK);
}
if (column == 3){
setForeground(Color.BLACK);
}
if (column == 4){
if ("LONG".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
setForeground(Color.GREEN.darker());
}
if ("SHORT".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
setForeground(Color.RED);
}
}
if (column == 5){
setForeground(Color.BLACK);
}
if (column == 6){
setForeground(Color.BLACK);
}
if (column == 7){
setForeground(Color.BLACK);
}
if (column == 8){
setForeground(Color.BLACK);
}
if (column == 9){
setForeground(Color.BLACK);
}
if (column == 10){
setForeground(Color.BLACK);
}
if (column == 11){
double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 11).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 12){
double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 12).toString());
if (d > 0) {
setForeground(Color.GREEN.darker());
}
if (d == 0) {
setForeground(Color.BLACK);
}
if (d < 0) {
setForeground(Color.RED);
}
}
if (column == 13){
setForeground(Color.BLACK);
}
if (column == 14){
setForeground(Color.BLACK);
}
setText(value.toString());
return this;
}
}发布于 2013-08-11 00:21:05
问题是,形成的颜色不能反映排序操作所做的更改。
您对渲染器中的逻辑有问题。您可能使用“查看行”而不是“模型行”访问表模型中的数据。
由于您没有发布演示问题的SSCCE,所以我不能只给您一个特定的解决方案,而只能给出一个通用的解决方案。查看以下JTable方法:
convertRowIndexToModel(int viewRowIndex)
convertRowIndexToView(int modelRowIndex) 呈现器接收视图行号。
https://stackoverflow.com/questions/18167512
复制相似问题