【问题标题】:How to set custom DefaultTreeCellRenderer at JXTreeTable如何在 JXTreeTable 上设置自定义 DefaultTreeCellRenderer
【发布时间】:2015-10-29 14:15:46
【问题描述】:

我想设置我的自定义 DefaultTreeCellRenderer。

所以我建立了这个类:

class CustomTreeTableSpeseXCategoriaSpese extends DefaultTreeCellRenderer {
    /**
     * 
     */
    private static final long serialVersionUID = 4842418316518803090L;
    private Font fontTotale = new Font("Verdana", Font.BOLD, 12);
    private Font fontNegativo = new Font("Verdana", Font.BOLD, 12);
    private int numeroRighe;
    CustomTreeTableSpeseXCategoriaSpese(int numeroRighe){
        this.numeroRighe=numeroRighe;
    }

    public Component getTreeCellRendererComponent(
            JTree tree,
            Object value,
            boolean selected,
            boolean expanded,
            boolean leaf,
            int row,
            boolean hasFocus) {
        // Allow the original renderer to set up the label
        Component rendererComponent = super.getTreeCellRendererComponent(
                tree, value, selected,
                expanded, leaf, row,
                hasFocus); 



        rendererComponent.setBackground( Color.WHITE );
        if (row== this.numeroRighe-1) {
            rendererComponent.setForeground(Color.BLACK);
            rendererComponent.setBackground( Color.RED );
            rendererComponent.setFont(fontTotale);
        }else if(row != this.numeroRighe/* && column !=3*/){
            rendererComponent.setForeground( Color.BLACK );
            rendererComponent.setBackground(new Color(200, 200, 200));
        }else if(row != this.numeroRighe-1 /*&& column ==3*/){


        }


        return rendererComponent; 
    }
} 

使用此代码,我看不到我的背景颜色和前景色。 另一个问题是,是否可以为不同的列设置不同的渲染器?我希望前 3 列有背景和前景色,因为另一列有不同的渲染器。

编辑

使用该代码,我可以看到这样的 JXTreeTable:

但我想像这样显示 TreeTable:

编辑

public class CustomTreeTableSpeseXCategoriaSpese extends JLabel implements TreeCellRenderer, TableCellRenderer {
    /**
     * 
     */
    private static final long serialVersionUID = 4842418316518803090L;
    private Font fontTotale = new Font("Verdana", Font.BOLD, 12);
    private Font fontNegativo = new Font("Verdana", Font.BOLD, 12);

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setOpaque(true);
        setBackground(isSelected ? new Color(83,142,213) : Color.white);
        setForeground(isSelected ? Color.white : Color.black);
        setText(value != null ? value.toString() : "<null>");
        return this;
    }

    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        //rendererComponent.setBackground( Color.WHITE );
        if (row== tree.getRowCount()) {
            setForeground(Color.BLACK);
            setOpaque(true);
            setBackground( Color.RED );
            setFont(fontTotale);
        }else if(row != tree.getRowCount()/* && column !=3*/){
            setForeground( Color.BLACK );
            setOpaque(true);
            setBackground(new Color(200, 200, 200));
        }else if(row != tree.getRowCount()-1 /*&& column ==3*/){
            //verifico il valore se negativo rosso
            //se positivo blu
            /*String valore = super.getValueAt(row, column).toString();
            if(valore.startsWith("-")){
                rendererComponent.setForeground(Color.red);
                rendererComponent.setFont(fontNegativo);
            }else{
                rendererComponent.setForeground(Color.blue);
                rendererComponent.setFont(fontNegativo);
            }*/
        }
         setText(value != null ? value.toString() : "<null>");
        return this; 
    }
} 

【问题讨论】:

    标签: java swing swingx jtreetable treecellrenderer


    【解决方案1】:

    使用此代码,我看不到我的背景颜色和前景色。

    很难说,因为您没有显示如何将渲染器设置为树表,这导致了您的第二个问题。

    另一个问题是,可以设置不同的渲染器 不同的列?我希望前 3 列有背景并且 前景色,对于其他列有不同的渲染器。

    JXTreeTable 由树和表两部分组成,因此您必须同时设置 TreeCellRendererTableCellRenderer 才能进行自定义渲染。像这样的:

    treeTable.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
    treeTable.setTreeCellRenderer(new CustomTreeCellRenderer());
    

    您可以创建一个实现两个接口的类,如 this Q/A 所示

    【讨论】:

    • 我看到了那个帖子,但我看不到变化。我刚刚编辑了我的第一个问题
    • 我怀疑您正在跳过主要部分:将渲染器设置为您的树表。您仍然没有在代码中仅显示渲染器类。 @比尔卡斯特里
    • 现在我可以为TreeTable的表格部分设置渲染器了,没问题。但现在我无法设置 FIRST 列的渲染
    • 第一列是树部分。像这样设置树单元渲染器:treeTable.setTreeCellRenderer(new CustomTreeTableSpeseXCategoriaSpese())。它应该可以正常工作。否则在您的问题中包含MVCE。 @比尔卡斯特里
    • 是的,我已插入此代码,但我无法在第一列设置正确的背景颜色。现在我可以在第 2、3、4 列等设置正确的渲染器,但我不能在 1 列设置渲染器
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多