【问题标题】:Change the color of some rows but not all in a JTable更改 JTable 中某些行的颜色,但不是全部
【发布时间】:2012-07-25 22:19:36
【问题描述】:

我创建了一个自定义单元格渲染器类来实现这一点。

public class MatchTableCellRenderer extends DefaultTableCellRenderer{


    public Component getTableCellRendererComponent (JTable table,
                                                    Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
        Component cell;
        cell = super.getTableCellRendererComponent(
                table, obj, isSelected, hasFocus, row, column);
        if( ((String[]) ((MatchTableModel) table.getModel()).getRow(row)).length==7 ){
            System.out.println(((String[]) ((MatchTableModel) table.getModel()).getRow(row))[0]+" "+((String[]) ((MatchTableModel) table.getModel()).getRow(row))[6]);

            cell.setForeground(Color.green);

        }
        return cell;
    }


}

并且我已将此渲染器设置为供我的表格列使用:

    tempColumn = table.getColumnModel().getColumn(0);
    tempColumn.setCellEditor(new MacColumnEditor());
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

    tempColumn = table.getColumnModel().getColumn(1);
    tempColumn.setCellEditor(new IpColumnEditor());
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

    tempColumn = table.getColumnModel().getColumn(2);
    DefaultCellEditor dfEditor=new DefaultCellEditor(new JTextField());
    dfEditor.setClickCountToStart(2);
    tempColumn.setCellEditor(dfEditor);
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

我想要包含长度为 7 的 String[] 的行和其他具有默认颜色的行。但有趣的是,我所有的行都变成了绿色。如您所见,我有一条打印线。它打印了 4 次(我的表有 12 行),但所有行都变成了绿色,而不是 4。我做错了什么?

【问题讨论】:

    标签: java swing jtable tablecellrenderer tablecelleditor


    【解决方案1】:

    原因是 DefaultTableCellEditor 臭名昭著的颜色记忆 (TM):您必须始终设置颜色,而不是只在一个分支中设置。

    if (myCondition) {
       setBackground(...) {
    } else {
       setBackground(...) 
    } 
    

    recent thread 中解释了确切的细节

    【讨论】:

    • 你给我的帖子帮了我很大的忙。谢谢你。现在我还有一个问题。表格排序后,我需要突出显示正常工作:/
    【解决方案2】:

    您可以使用XxxCellRenderer,但更好和最简单的是使用prepareRenderer()

    对于正确的代码,您必须在 if-else 遵循模式中覆盖或测试

    • 被选中

    • 有焦点

    answersquestion 中更多关于类似问题的信息

    【讨论】:

    • @MadProgrammer prepareRenderer 这样不是一个好主意,除非 a) 突出显示应该应用于完整的行 b) 精心设计的(再次偏向于我)可插入机制以完全控制什么/何时/如何装饰组件 - as fi在 SwingX 中 :-) 出于应用原因,基本规则是不要对任何 JSomething 进行子类化
    • +1 感谢您的回答。 prepareRenderer() 帮助了我,但我通过@kleopatra 的回答实现了我想要的
    • @kleopatra 虽然我不同意,但我认为这归结为手头的要求
    • @MadProgrammer 当然,它总是这样 :-) 但是 OP 不属于可以证明违反基本规则的类别。无论如何,OP 看到的 problem 独立于 where 完成着色,仅取决于 how
    • @kleopatra 考虑到信息量,确切地知道需要什么是一个困难的电话,虽然我同意你的回答,我肯定会鼓励它扩展基类,拥有信息明智的决定也很重要(这就是我喜欢你的地方)——不是“你是个白痴”,而是“你是个白痴,这就是为什么”;)——这只是 MHO。我期待并期待你让我保持警惕!另外,就我个人而言,如果不需要颜色,我会让渲染器透明,但那只是我自己 ;)
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2014-07-06
    • 1970-01-01
    • 2013-05-28
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多