【问题标题】:How can set Font and Background color at child node of JXTreeTable如何在 JXTreeTable 的子节点设置字体和背景颜色
【发布时间】:2015-11-26 14:07:51
【问题描述】:

我有一个简单的 Java swing 应用程序。所以我有一个带有 JXTreeTable 的 JPanel。我可以在这个 TreeTable 中插入带有子节点的 soma 行,这样就可以了。

现在如果我尝试运行我的应用程序,我可以看到:

这也没关系。所以,现在如果我尝试扩展一个或多个 NODE,我可以看到:

我想知道是否可以更改渲染(为 NODE 子节点设置另一个背景或其他字体颜色。

这是我用来创建 JXTreeTable 的代码。

private void createTable(List<Entrate> v,String tipoConto){
    tableCatEntrate = new CustomTreeTableEntrate(v,tipoConto);
    daiProprietaJTableCatEntrate();
    jscrollPaneCatEntrate.setViewportView(tableCatEntrate);
}

这是 CustomTreeTableEntralte 类:

public class CustomTreeTableEntrate extends JXTreeTable{

    public CustomTreeTableEntrate(List<Entrate> listaConti,String tipoConto){
        setTreeTableModel(new RandomTextTreeTableModel(listaConti,tipoConto));
        setRowSelectionAllowed(false);
        this.setDefaultRenderer(Object.class, new CustomTreeTableSpeseXCategoriaSpese());
    }
    class RandomTextTreeTableModel extends DefaultTreeTableModel {
        public final NumberFormat decimalFormatter2 = new DecimalFormat("#,##0.00");
        DefaultMutableTreeTableNode Root = null;
        final String[] ColName = {"","Acquisti/Vendite","Uscite","Entrate","Saldo"};
        //public LinkedHashMap<String, Entrate> mappaConti = new LinkedHashMap<String, Entrate>();
        String tipoConto;

        RandomTextTreeTableModel(List<Entrate>listaConti,String tipoConto) {
            Root = new DefaultMutableTreeTableNode();
            this.setRoot(Root);
            for (Entrate conti : listaConti) {
                DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(conti);
                Root.add(node);
                if(conti.getListaContiFigli()!=null){
                    for (Entrate contoFiglio : conti.getListaContiFigli()) {
                        node.add(new DefaultMutableTreeTableNode(contoFiglio));
                        mappaConti.put(contoFiglio.getDescrizione(), contoFiglio);
                    }
                }
                contoTotale.setTotale(conti.getTotale()+contoTotale.getTotale());
                contoTotale.setTotalePubblico(conti.getTotalePubblico()+contoTotale.getTotalePubblico());
                contoTotale.setEntrate(conti.getEntrate()+contoTotale.getEntrate());
                contoTotale.setUscite(conti.getUscite()+contoTotale.getUscite());
            }

            DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(contoTotale);
            Root.add(node);
        }

        @Override
        public Object getValueAt(Object arg0, int arg1) {
            try{
                if(arg1==0){
                    int numberElement = ((DefaultMutableTreeTableNode)arg0).getChildCount();
                    if(numberElement<=0)
                        return null;
                    //Conti c = (Conti)((DefaultMutableTreeTableNode)arg0).getChildAt(0).getUserObject();
                    return "";
                }
                Entrate c = (Entrate)((DefaultMutableTreeTableNode)arg0).getUserObject();
                if(c==null)
                    return null;
                if (arg1 == 0) {
                    return "";
                }else if (arg1 == 1) {
                    return c.getDescrizione();
                }else if (arg1 == 2) {
                    return decimalFormatter2.format(c.getUscite());
                }else if (arg1 == 3) {
                    return decimalFormatter2.format(c.getEntrate());
                }else if (arg1 == 4 && tipoConto!=null && tipoConto.equalsIgnoreCase(WFConst.TIPO_CONTO_DEFAULT_AMMINISTRAZIONE_PRIVATO)) {
                    return decimalFormatter2.format(c.getTotale());
                }else if (arg1 == 4 && tipoConto!=null && tipoConto.equalsIgnoreCase(WFConst.TIPO_CONTO_DEFAULT_AMMINISTRAZIONE_PUBBLICO)) {
                    return decimalFormatter2.format(c.getTotalePubblico());
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return arg0;
        }



    }

}

这是 TreeTableRenderer,我认为问题出在这个类中,因为如果我尝试执行 Debug,我无法进入 getTreeCellRendererComponent。

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);




    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);
            setBackground( Color.RED );
            setFont(fontTotale);
        }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){
            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;
    }



    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean selected, boolean expanded, boolean leaf, int row,
            boolean hasFocus) {
        setOpaque(true);

        if(expanded){
            setForeground(Color.PINK);
            setBackground( Color.PINK );
            setFont(fontTotale);
        }
        return this;
    }
} 

【问题讨论】:

    标签: java swing tablecellrenderer jxtreetable treecellrenderer


    【解决方案1】:

    您已经在使用TreeCellRenderer,所以您已经很接近了。 您需要做的就是访问模型(类似于DefaultTreeModel)并使用getPathToRoot() 查看您在树中的深度并相应地更改渲染器。

    一个例子:

    DefaultTreeCellRenderer defaultTreeCellRenderer = new DefaultTreeCellRenderer() {
        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                      boolean selected, boolean expanded, boolean leaf, int row,
                                                      boolean hasFocus) {
            setOpaque(true);
    
            DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
            if (model.getPathToRoot((TreeNode) value).length > 2) {
                //Do your rendering goodness here
            } else if (expanded) {
                setForeground(Color.PINK);
                setBackground(Color.PINK);
                setFont(fontTotale);
            }
            return this;
        }
    };
    

    注意我做了一些假设,所以请根据您的需要更正。

    1. 型号是DefaultTreeModel
    2. 节点是TreeNode
    3. 您只关心节点是否至少 3 层深

    另外,请查看 JavaDoc 的此功能,以确保它是您需要的。

    【讨论】:

    • 感谢您的回答。如果我尝试执行您的代码,我只能为第一列设置背景颜色,而不是子节点而是根节点。你能帮帮我吗?
    • @bircastri 您是否尝试过使用类似的逻辑从TableCellRenderer 调整您的getTableCellRendererComponent()?我给出的示例仅实现了您的自定义渲染器的TreeCellRenderer 部分。
    • 好的,只有一个问题,如何检索到渲染器的列是什么?因为在 gettableCellrendererComponent() 我有 TreeCellRendere 中的列值我没有这个信息
    • 我认为您不必担心TreeCellRenderer 中的列。但是TableCellRenderer 确实为您提供了行和列信息。让我知道这是否适合您。
    • 嗯,我不知道,因为如果我只使用 TableCellRenderer 我有一个正确的布局,但我还想更改子节点的布局
    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多