Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JXTreeTable上设置自定义DefaultTreeCellRenderer_Java_Swing_Swingx_Jtreetable_Treecellrenderer - Fatal编程技术网

Java 如何在JXTreeTable上设置自定义DefaultTreeCellRenderer

Java 如何在JXTreeTable上设置自定义DefaultTreeCellRenderer,java,swing,swingx,jtreetable,treecellrenderer,Java,Swing,Swingx,Jtreetable,Treecellrenderer,我想设置我的自定义DefaultTreeCellRenderer 所以我建立了这个类: class CustomTreeTableSpeseXCategoriaSpese extends DefaultTreeCellRenderer { /** * */ private static final long serialVersionUID = 4842418316518803090L; private Font fontTotale = new F

我想设置我的自定义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列有背景色和前景色,另一列有不同的渲染器

编辑

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; 
    }
} 
有了这些代码,我可以看到如下JXTreeTable:

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

但我想把树表展示成这样:

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

编辑

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; 
    }
} 
public类customTreeTableSpesexCategory扩展JLabel实现TreeCellRenderer、TableCellRenderer{
/**
* 
*/
私有静态最终长serialVersionUID=4842418316518803090L;
私有字体fontTotale=新字体(“Verdana”,Font.BOLD,12);
私有字体FontNegative=新字体(“Verdana”,Font.BOLD,12);
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
set不透明(true);
挫折背景(isSelected?新颜色(83142213):颜色。白色);
设置前景(选择?颜色。白色:颜色。黑色);
setText(value!=null?value.toString():“”);
归还这个;
}
公共组件GetTreeCellRenderComponent(JTree树、对象值、布尔选定、布尔展开、布尔叶、int行、布尔hasFocus){
//RenderComponent.setBackground(颜色:白色);
if(row==tree.getRowCount()){
设置前景(颜色为黑色);
set不透明(true);
挫折地面(颜色:红色);
setFont(fontTotale);
}else if(row!=tree.getRowCount()/*&&column!=3*/){
设置前景(颜色为黑色);
set不透明(true);
挫折背景(新颜色(200200200));
}else if(row!=tree.getRowCount()-1/*&&column==3*/){
//瓦洛雷红牛队
//硒正蓝光
/*字符串valore=super.getValueAt(行、列).toString();
if(从价开始,以“-”号填列){
RenderComponent.setForeground(颜色:红色);
RenderComponent.setFont(FontNegative);
}否则{
renderComponent.setForeground(Color.blue);
RenderComponent.setFont(FontNegative);
}*/
}
setText(value!=null?value.toString():“”);
归还这个;
}
} 
用这段代码我看不到我的背景色,我的前景色

很难说,因为您没有展示如何将渲染器设置到树表,这就引出了第二个问题

另一个问题是,可以为设置不同的渲染器 不同的专栏?我希望前3列有背景和 前景色,对于其他列,使用不同的渲染器

JXTreeTable
由树和表两部分组成,因此您必须同时设置
TreeCellRenderer
TableCellRenderer
进行自定义渲染。大概是这样的:

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

您可以创建一个实现两个接口的类,如所示。我已经看到了那篇文章,但是我看不到更改。我刚刚编辑了我的第一个问题,我怀疑你跳过了主要部分:将渲染器设置到树表。您仍然没有在代码中显示该部分,只显示渲染器类@bircastriNow我可以为TreeTable的表部分设置渲染器,这样就可以了。但是现在我无法设置第一列的渲染。第一列是树的一部分。按如下方式设置树单元渲染器:
treeTable.setTreeCellRenderer(新的CustomTreetablesPesexCategorizape())
。应该可以。否则,请在问题中添加一个@bircastriYes,我已经插入了这段代码,但我无法在第一列设置正确的背景色。现在我可以在列2、3、4等处设置正确的渲染器,但不能在列1处设置渲染器