自定义TableCellRenderer不起作用(表行呈现) [英] Custom TableCellRenderer not working (table row rendering)

查看:309
本文介绍了自定义TableCellRenderer不起作用(表行呈现)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to render an specific row of my jtable (it should have a different background color and it should have bold characters).

我发现了一些有关如何实现自定义TableCellRenderer的问题(此处 )和教程如何使用表格和一个(表行渲染).

I found several questions regarding how to implement a custom TableCellRenderer (here and here) and the tutorial How to Use Tables and this one (Table Row Rendering).

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

I'm using a JInternalFrame to display the JTable. I tried to implement both solutions but neither getCellRenderer nor prepareRenderer are being called. When debugging, I can see my new jtable being created, but, my breakpoint inside the methods aren't called.

我的代码如下:

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的实现.

As you can see, model is my implementation of a AbstractTableModel.

我当然想念一些东西.我试图打电话给repaint()以查看是否发生了什么,但什么也没发生.

Of course that I'm missing something. I tried to call repaint() to see if something happened, but nothing occurred.

我还尝试将JPane放入我的JInternalFrame内,然后将JScrollPane添加到其中,但也没有发生任何事情.

I also tried to put a JPane inside my JInternalFrame and them add the JScrollPane into it, but nothing occurred also.

有帮助吗?

TIA,

鲍勃

推荐答案

概念:编辑器和渲染器 ,表调用表模型的getColumnClass方法,该方法将获取列单元格的数据类型."您应该验证AbstractTableModel的实现是否返回了适当的值,如此示例.

As discussed in Concepts: Editors and Renderers, "the table invokes the table model's getColumnClass method, which gets the data type of the column's cells." You should verify that your implementation of AbstractTableModel returns a suitable value, as suggested in this example.

附录:

我正在尝试呈现一行,而不是一列.

I'm trying to render a row, not a column.

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

Rob Camick's Table Row Rendering approach that overrides prepareRenderer() seems 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);
}

这篇关于自定义TableCellRenderer不起作用(表行呈现)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆