【问题标题】:How to color Jtable cell when renderer is applied应用渲染器时如何为 Jtable 单元格着色
【发布时间】:2018-04-19 11:18:26
【问题描述】:

您好,我正在处理 jtable,我必须以在特定列中应用 CurrencyRender 的方式使用单元格渲染器。我也在每行应用着色离子。一切都很完美,但是当我在我的数字列中应用 currencyRenderer 时,它失去了背景颜色。这可能是由于添加了货币的 cellrenderer 。请建议我应该如何使用货币渲染器为列着色。这是我的代码

    this.installAllignment(this.tblDemandView.getColumnModel().getColumn(numAmount), SwingConstants.RIGHT);
    this.tblDemandView.getTableHeader().setReorderingAllowed(false);
    this.tblDemandView.getTableHeader().setResizingAllowed(true);
    tblDemandView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    NumberFormat _formatf = NumberFormat.getNumberInstance();
    _formatf.setMinimumFractionDigits(2);
    _formatf.setMaximumFractionDigits(2);

    MyCurrencyRenderer _rendererf = new MyCurrencyRenderer(_formatf); 
    TableColumnModel _model = tblDemandView.getColumnModel();
    TableColumn _columnPu=_model.getColumn(_model.getColumnIndex("Amount"));
     _columnPur.setCellRenderer(_rendererf);

private void installAllignment(TableColumn tableColumn, final int alignmentCode) {

    tableColumn.setCellRenderer(new DefaultTableCellRenderer() {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                                                       boolean hasFocus, int row, int column) {
            Component myself =
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            setHorizontalAlignment(alignmentCode);

           DefaultTableModel model = (DefaultTableModel) table.getModel();
                  Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     DefaultTableCellRenderer() {
            if (row == table.getRowCount() - 1) {
                Insets insets = new Insets(1, 0, 0, 0);

                // setBorder(BorderFactory.createLineBorder(Color.BLACK));
            }

            return myself;
        }
    });

}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 更好的解决方案是设计一个委托模式,该模式将应用于每一列,以便调用一系列委托以可插入的方式提供呈现功能
  • 这实际上很难看起来。只使用默认 API,您将需要一个处理行着色的基本渲染器类,然后将其用作所有其他渲染器的父类。这并不总是可能的,也不是特别漂亮,而且很快就会成为管理难题。相反,您可以使用众多糖果剥离 API 之一,例如 as this example

标签: java swing jtable tablecellrenderer cellrenderer


【解决方案1】:

您的代码没有多大意义。您不会对 modelcinsets 变量做任何事情。

但是改变渲染器真的很简单。子类化TableColumn 并覆盖getTableCellRenderer。在body中调用super方法生成默认渲染器组件,然后在返回之前设置背景。

或者,您可以实现自己的TableCellRenderer,然后在列上调用setTableCellRenderer,而不是子类化。

这两种方法都可以正常工作,并且在不同的情况下都很有用。

【讨论】:

    【解决方案2】:

    一切都很完美,但是当我在我的数字列中应用 currencyRenderer 时,它失去了背景颜色。

    我不知道您是在谈论丢失选择背景颜色,还是您用于自定义渲染的其他颜色。

    尝试使用Table Row Rendering 代替单元格渲染。这种方法会覆盖表格的prepareRenderer(...) 方法来进行自定义着色。

    您可能还想在同一个博客中查看Table Format Renderers。它展示了如何轻松创建自定义渲染器。

    顺便说一句,您的渲染器中的代码对我来说毫无意义:

    Component myself = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    setHorizontalAlignment(alignmentCode);
    
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    

    我不知道你为什么要调用 getTableCellRendererComponent(...) 方法两次。

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 2013-02-10
      • 2013-03-14
      • 2013-01-11
      • 2011-10-02
      • 2013-06-30
      • 2012-08-05
      • 2014-06-26
      • 2015-08-13
      相关资源
      最近更新 更多