繁体   English   中英

JTable 渲染器不对单元格着色

[英]JTable renderer does not colour the cell

截屏

我写了一个渲染器,我的程序没有给单元格着色,我不知道为什么。 当我尝试为整行着色时,它也 colors 只有 7 行中的 3 行。 有人可以帮帮我吗?

public void isLow(JTable jTableBestandstabelle) {
    jTableBestandstabelle.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(
                JTable aTable, Object aNumberValue, boolean aIsSelected,
                boolean aHasFocus, int aRow, int aColumn
        ) {

            if (aNumberValue == null) {
                return this;
            }
            Component renderer = super.getTableCellRendererComponent(
                    aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn
            );
            int m = (int) jTableBestandstabelle.getValueAt(aRow, 4);
            int a = (int) jTableBestandstabelle.getValueAt(aRow, 5);
            if (a < m && column == 5) {
                renderer.setForeground(Color.black);
                renderer.setBackground(Color.red);
            } else {
                renderer.setForeground(Color.black);
            }
            return this;
        }


    }); 
}

public void isLow(JTable jTableBestandstabelle) {
    jTableBestandstabelle.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(
                JTable aTable, Object aNumberValue, boolean aIsSelected,
                boolean aHasFocus, int aRow, int aColumn
        ) {

            if (aNumberValue == null) {
                return this;
            }
            Component renderer = super.getTableCellRendererComponent(
                    aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn
            );
            int m = (int) jTableBestandstabelle.getValueAt(aRow, 4);
            int a = (int) jTableBestandstabelle.getValueAt(aRow, 5);
            if (a < m) {
                renderer.setForeground(Color.black);
                renderer.setBackground(Color.red);
            } else {
                renderer.setForeground(Color.black);
            }
            return this;
        }


    }); 
}

您的代码中有两个问题:

  1. 您在表中使用 boolean 列(最后一列)。 因此,如果您想在列中显示一个复选框,则不能使用DefaultTableCellRenderer

  2. When you use table.setDefaultRenderer(Object.class, renderer) this will not work for some primitive tapes like Boolean.class or Integer.class (don't know why). 因此,您还需要为这些类设置渲染器( table.setDefaultRenderer(Integer.class, renderer)table.setDefaultRenderer(Boolean.class, renderer) )。 但由于第 1 点,这不是一个好主意。

这是我的解决方案:

import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

/**
 * <code>TestTable</code>.
 */
public class TestTable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TestTable()::startUp);
    }

    private void startUp() {
        DefaultTableModel model = new DefaultTableModel(0, 7) {
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                if (columnIndex == 6) {
                    return Boolean.class; // last column is boolean
                } else if (columnIndex == 0 && columnIndex > 3) {
                    return Integer.class; // 1, 4, 5 are integers
                }
                return super.getColumnClass(columnIndex);
            }
        };
        model.addRow(new Object[] {1, "Test1", "Test2", "Test3", 6, 5, false});
        model.addRow(new Object[] {1, "Test11", "Test22", "Test33", 4, 5, true});
        JTable table = new JTable(model);
        for (int i = 0; i < table.getColumnCount(); i++) {
            TableColumn col = table.getColumnModel().getColumn(i);
            int modelCol = table.convertColumnIndexToModel(i);
            col.setCellRenderer(new MyCellRenderer(table.getDefaultRenderer(model.getColumnClass(modelCol))));
        }
        JFrame frm = new JFrame("Table test");
        frm.add(new JScrollPane(table));
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class MyCellRenderer implements TableCellRenderer {
        private final TableCellRenderer origin;

        public MyCellRenderer(TableCellRenderer origin) {
            this.origin = origin;
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component c = origin.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            int m = (int) table.getValueAt(row, 4);
            int a = (int) table.getValueAt(row, 5);
            if (a < m) {
                c.setForeground(Color.black);
                c.setBackground(Color.red);
            } else {
                c.setForeground(Color.black);
                c.setBackground(Color.white);
            }
            return c;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM