【问题标题】:Custom TableCellRenderer not working (table row rendering)自定义 TableCellRenderer 不工作(表格行渲染)
【发布时间】:2011-04-23 08:37:55
【问题描述】:

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

我发现了几个关于如何实现自定义TableCellRendererherehere)和教程How to Use Tables 和这个(Table Row Rendering)的问题。

我使用JInternalFrame 来显示JTable。我尝试实现这两种解决方案,但都没有调用 getCellRendererprepareRenderer。调试时,我可以看到我的新 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() 看看有没有发生什么,但什么也没发生。

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

有什么帮助吗?

TIA,

鲍勃

【问题讨论】:

  • 您发布的代码看起来不错。但是,我们不知道您如何实际使用此代码的上下文。因此,您的第一项工作是使用 DefaultTableModel 创建一个 SSCCE (sscce.org) 并查看是否可以使代码正常工作。如果不是,您发布整个 15 行 SSCCE 程序,以便我们可以准确地看到您在做什么。一旦成功,您可以尝试使用您的自定义 TableModel。

标签: java swing jtable cellrenderer


【解决方案1】:

正如Concepts: Editors and Renderers 中所讨论的,“表格调用表格模型的getColumnClass 方法,该方法获取列单元格的数据类型。”您应该验证您的AbstractTableModel 实现是否返回合适的值,正如example 中所建议的那样。

附录:

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

Rob Camick 覆盖 prepareRenderer()Table Row Rendering 方法似乎很合适。

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);
}

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2016-12-03
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多