2

我正在尝试渲染我的 jtable 的特定行(它应该有不同的背景颜色,并且应该有粗体字符)。

我发现了几个关于如何实现自定义的问题TableCellRenderer这里这里)以及教程如何使用表格和这个(表格行渲染)。

我正在使用 aJInternalFrame来显示JTable. 我试图实现这两种解决方案,但都getCellRenderer没有prepareRenderer被调用。调试时,我可以看到我的新 jtable 正在创建,但是方法中的断点没有被调用。

我的代码如下所示:

this.add(createData(model));

private JComponent createData(ProfitLossTableModel model) {
    JTable table = new JTable(model) {

        public TableCellRenderer getCellRenderer(int row, int column) {
            if ((row == 0) && (column == 0)) {
                DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
                renderer.setHorizontalAlignment(JLabel.RIGHT);
                renderer.setBackground(Color.red);
                return renderer;
            } else {
                return super.getCellRenderer(row, column);
            }
        }
    };

    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    table.changeSelection(0, 0, false, false);
    table.setAutoCreateRowSorter(true);
    return new JScrollPane(table);
}

如您所见,模型是我对 a 的实现AbstractTableModel

当然,我错过了一些东西。我试着打电话repaint()看看是否发生了什么事,但什么也没发生。

我还尝试在我的 JInternalFrame 中放置一个 JPane,然后他们将 JScrollPane 添加到其中,但也没有发生任何事情。

有什么帮助吗?

TIA,

鲍勃

4

1 回答 1

2

正如概念:编辑器和渲染器中所讨论的,“表调用表模型的getColumnClass方法,该方法获取列单元格的数据类型。” 您应该验证您的实现是否AbstractTableModel返回合适的值,如本示例中所建议的那样。

附录:

我正在尝试渲染一行,而不是一列。

Rob Camick 的覆盖表行渲染方法prepareRenderer()似乎很合适。

tabbedPane.addTab("FirstRow", createFirstRow(model));
...
private JComponent createFirstRow(DefaultTableModel model) {

    final Font font = new Font("Serif", Font.BOLD, 14);

    JTable table = new JTable(model) {

        public Component prepareRenderer(
                TableCellRenderer renderer, int row, int column) {
            Component c = super.prepareRenderer(renderer, row, column);
            if (!isRowSelected(row)) {
                c.setBackground(row == 0 ? Color.yellow: getBackground());
                c.setFont(row == 0 ? font : getFont());
            }
            return c;
        }
    };

    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    table.changeSelection(1, 1, false, false);
    return new JScrollPane(table);
}
于 2010-10-10T05:26:16.293 回答