如何在Java应用程序中设置GetTreeCellRenderComponent

如何在Java应用程序中设置GetTreeCellRenderComponent,java,swing,jxtreetable,Java,Swing,Jxtreetable,大家好,我有一个带有自定义DefaultTreeTableModel的JXtreeTable 现在我想要这个: 将默认图标更改为打开文件夹图标(当节点打开时),关闭文件夹图标(当节点关闭时) 我想在子节点打开时更改其所有行渲染器 所以我有这个代码: public class CustomTreeTableSpeseXCategoriaSpese extends JLabel implements TreeCellRenderer, TableCellRenderer { /**

大家好,我有一个带有自定义DefaultTreeTableModel的JXtreeTable

现在我想要这个:

  • 将默认图标更改为打开文件夹图标(当节点打开时),关闭文件夹图标(当节点关闭时)
  • 我想在子节点打开时更改其所有行渲染器
  • 所以我有这个代码:

    public class CustomTreeTableSpeseXCategoriaSpese extends JLabel implements TreeCellRenderer, TableCellRenderer {
        /**
         * 
         */
        //DefaultTreeCellRenderer defaultRenderer = new 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 Font fontProva = new Font("Verdana", Font.BOLD, 20);
    
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, 
                boolean isSelected, boolean hasFocus, int row, int column) {
            setOpaque(true);
    
    
    
            if(column ==1){
                setHorizontalAlignment(SwingConstants.LEFT);
            }else{
                setHorizontalAlignment(SwingConstants.RIGHT);
            }
    
            if (row== table.getRowCount()-1) {
                setForeground(Color.BLACK);
                setFont(fontTotale);
                setBackground( Color.RED );
            }else if(row != table.getRowCount() && column !=4){
                setForeground( Color.BLACK );
                setBackground(new Color(200, 200, 200));
                setFont(UtilitySwing.getTableFont());
            }else if(row != table.getRowCount()-1 && column ==4){
                //verifico il valore se negativo rosso
                //se positivo blu
                String valore = value.toString();
                if(valore.startsWith("-")){
                    setForeground(Color.red);
                    setFont(fontNegativo);
                }else{
                    setForeground(Color.blue);
                    setFont(fontNegativo);
                }
            }
            setText(value != null ? value.toString() : "<null>");
            return this;
        }
    
    SEE EDIT COMMENT
    public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean selected, boolean expanded, boolean leaf, int row,
                boolean hasFocus) {}
            
        } 
    
    public类customTreeTableSpesexCategory扩展JLabel实现TreeCellRenderer、TableCellRenderer{
    /**
    * 
    */
    //DefaultTreeCellRenderer defaultRenderer=新的DefaultTreeCellRenderer();
    私有静态最终长serialVersionUID=4842418316518803090L;
    私有字体fontTotale=新字体(“Verdana”,Font.BOLD,12);
    私有字体FontNegative=新字体(“Verdana”,Font.BOLD,12);
    //私有字体fontProva=新字体(“Verdana”,Font.BOLD,20);
    @凌驾
    公共组件GetTableCellRenderComponent(JTable表、对象值、,
    布尔值(已选择,布尔值为焦点,整数行,整数列){
    set不透明(true);
    如果(列==1){
    设置水平对齐(SwingConstants.左);
    }否则{
    设置水平对齐(SwingConstants.右侧);
    }
    if(row==table.getRowCount()-1){
    设置前景(颜色为黑色);
    setFont(fontTotale);
    挫折地面(颜色:红色);
    }else if(行!=table.getRowCount()&&column!=4){
    设置前景(颜色为黑色);
    挫折背景(新颜色(200200200));
    setFont(UtilitySwing.getTableFont());
    }else if(行!=table.getRowCount()-1&&column==4){
    //瓦洛雷红牛队
    //硒正蓝光
    字符串valore=value.toString();
    if(从价开始,以“-”号填列){
    设置前景(颜色为红色);
    setFont(FontNegative);
    }否则{
    设置前景(颜色:蓝色);
    setFont(FontNegative);
    }
    }
    setText(value!=null?value.toString():“”);
    归还这个;
    }
    请参见编辑注释
    公共组件GetTreeCellRenderComponent(JTree树,对象值,
    布尔选定、布尔展开、布尔叶、整型行、,
    布尔hasFocus){}
    } 
    
    使用此代码,我没有正确的布局。如果我尝试运行我的应用程序,我会看到这一点

    我不明白为什么我在图标上也看到像com.mcsolution.beans这样的对象字符串。Entrata@11111

    编辑我使用以下命令更改GetTreeCellenderComponent方法:

    公共组件GetTreeCellRenderComponent(JTree树,对象值,
    布尔选定、布尔展开、布尔叶、整型行、,
    布尔值(焦点){
    set不透明(true);
    RandomTextTreeTableModel=(RandomTextTreeTableModel)tree.getModel();
    if(model.getPathToRoot((TreeTableNode)值).length>2){
    //你在这儿干什么
    //设置前景(颜色为黑色);
    挫折地面(颜色:白色);
    }
    如果(扩展){
    ImageIcon renderIcon=新的ImageIcon(getClass().getResource(“/resources/folder_open.png”);
    设置图标(渲染器图标);
    //挫折背景(颜色:绿色);
    //setFont(fontProva);
    }否则{
    ImageIcon renderIcon=新的ImageIcon(getClass().getResource(“/resources/folder_close.png”);
    设置图标(渲染器图标);
    }
    //瑟诺哈菲格利酒店
    如果(叶){
    设置图标(空);
    }
    setText(value!=null?value.toString():“”);
    归还这个;
    }
    

    现在我可以看到正确的图标,但我继续看到write com.mcsolution。。。。。而且我不能用子节点设置另一种字体。

    请尝试以下示例和。好的,通过您的示例,我可以设置正确的关闭或打开图像,但对于另一个,我的问题是什么?什么不起作用?请编辑您的问题,使其包含一个集中在单个问题上并显示您当前方法的“com.mcsolution.beans”。Entrata@11111“看起来像默认的
    toString
    实现:“[class name]@[hash code]”。如果您在问题中添加更多代码,使其成为一个完整的示例,我们可能会进一步帮助您。目前,人们不得不猜测树表是如何构造的,这使得很难确定问题是什么以及如何解决它。
    public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean selected, boolean expanded, boolean leaf, int row,
                boolean hasFocus) {
            setOpaque(true);
    
            RandomTextTreeTableModel model = (RandomTextTreeTableModel) tree.getModel();
            
            
            if (model.getPathToRoot((TreeTableNode) value).length > 2) {
                //Do your rendering goodness here
                //setForeground( Color.BLACK );
                setBackground(Color.white);
                
            }
            
            if (expanded) {
                ImageIcon rendererIcon = new ImageIcon(getClass().getResource("/resources/folder_open.png"));
                setIcon(rendererIcon);
                //setBackground(Color.green);
                //setFont(fontProva);
            }else{
                ImageIcon rendererIcon = new ImageIcon(getClass().getResource("/resources/folder_close.png"));
                setIcon(rendererIcon);
            }
            
            //se non ha figli
            if(leaf){
                setIcon(null);
            }
            setText(value != null ? value.toString() : "<null>");
            return this;
        }