【问题标题】:Swing JTable with custom TableCellRenderer使用自定义 TableCellRenderer 摆动 JTable
【发布时间】:2017-01-02 09:26:31
【问题描述】:

在我的 java 应用程序中,我想设置颜色以及选择它时的行为。为此,我编写了 TableCellRenderer 的自定义实现,它可以按我的意愿工作。但是有一点我还是很困惑……

这里是TableCellRenderer的实现:

public class AccountMovementTableCellRenderer extends JLabel implements TableCellRenderer{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean  isSelected, boolean hasFocus, int row, int column){     
        //My implementation here...
        return this;
    }
}

这里是JTable的创建:

AccountMovementTableCellRenderer accountMovementCellRenderer = new AccountMovementTableCellRenderer();
entryTable = new JTable(entryModel){
    private static final long serialVersionUID = 1L;

    @Override
    public TableCellRenderer getCellRenderer(int row, int column){
        return accountMovementCellRenderer;
    }
};

我只创建了我的 CellRenderer 的一个实例,但我期望每个单元格有一个 CellRenderer,我很惊讶它以这种方式工作......每个单元格的内容和颜色都不同,但它始终使用相同的 CellRenderer 实例,那么这怎么可能呢?

【问题讨论】:

    标签: java swing jtable tablecellrenderer


    【解决方案1】:

    TableCellRenderer.prepareRenderer 返回的组件被重用于渲染 JTable 的内容 - 在您的情况下,您的渲染器扩展 JLabel(您可以刚刚扩展 DefaultTableCellRenderer) - 此 JLabel 用于绘制JTable 的内容。 prepareRenderer 方法用于在渲染之前为每个单元格自定义 JLabel。引用Oracle's tutorial on the JTables

    您可能希望表格中的每个单元格都是一个组件。但是,出于性能原因,Swing 表的实现方式有所不同。

    相反,通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格。您可以将渲染器视为一个可配置的墨迹标记,表格使用该墨迹标记将适当格式的数据标记到每个单元格上。当用户开始编辑单元格的数据时,单元格编辑器会接管该单元格,控制该单元格的编辑行为。

    【讨论】:

      【解决方案2】:

      单个渲染器实例为每个单元格创建一个自己的唯一图像,每个图像根据您上面的代码反映该单元格的状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 2017-04-29
        • 2011-01-23
        • 2013-08-12
        • 2011-11-09
        • 2011-08-13
        • 2012-04-30
        相关资源
        最近更新 更多