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

我发现了有关如何实施自定义的几个问题 TableCellRenderer (这里这里)和教程 如何使用桌子 和这个 (表行渲染).

我正在使用 JInternalFrame 显示 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);
}

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

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

我还试图将jpane放入我的jinternalframe中,然后将jscrollpane添加到其中,但也没有发生任何事情。

有帮助吗?

蒂亚,

鲍勃

有帮助吗?

解决方案

如所讨论的 概念:编辑和渲染器, ,“桌子调用表模型的 getColumnClass 方法,获取列单元的数据类型。“您应该验证您的实现 AbstractTableModel 返回合适的价值,如此所示 例子.

附录:

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

罗布·卡米克(Rob Camick) 表行渲染 覆盖的方法 prepareRenderer() 似乎是Apropos。

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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top