如何在JXTreeTable上显示String

时间:2015-08-06 08:50:39

标签: java swing jxtreetable

我想创建一个简单的JXTreeTable,所以我构建了这段代码:

public static void main(String[] args){
    JTreeTable table = new JTreeTable();
    JFrame frame=new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(new JScrollPane(table));
    frame.pack();
    frame.setVisible(true);
}

public JTreeTable(){
    List<Conti> listaConti = new ArrayList<Conti>();
    Conti c = new Conti();
    c.setDescrizione("LOCALE");
    c.setIva(10);
    c.setImponibile(100);
    c.setTotale(c.getImponibile()-c.getIva());

    List<Conti> listaFigli = new ArrayList<Conti>();
    Conti figlio = new Conti();
    figlio.setDescrizione("FINESTRE");
    figlio.setIva(5);
    figlio.setImponibile(50);
    figlio.setTotale(figlio.getImponibile()-figlio.getIva());
    listaFigli.add(figlio);

    figlio = new Conti();
    figlio.setDescrizione("IMPIANTO ELETRTICO");
    figlio.setIva(5);
    figlio.setImponibile(50);
    figlio.setTotale(figlio.getImponibile()-figlio.getIva());
    listaFigli.add(figlio);

    c.setListaContiFigli(listaFigli);
    listaConti.add(c);

    setTreeTableModel(new RandomTextTreeTableModel(listaConti));
    setRowSelectionAllowed(true);

    setDragEnabled(true);
    setEditable(true);
    setTreeCellRenderer(new DefaultTreeRenderer());
    setSelectionBackground(new Color(176, 197, 227));
    setSelectionForeground(new Color(0, 0, 128));

    BorderHighlighter border = new BorderHighlighter(new ColumnHighlightPredicate(1, 2), BorderFactory.createEmptyBorder(0, 6, 0, 6), false, false);
    addHighlighter(border);
}

class RandomTextTreeTableModel extends DefaultTreeTableModel {

    DefaultMutableTreeTableNode Root = null;
    final String[] ColName = {"Acquisti/Vendite","Uscite","Entrate","Saldo"};

    RandomTextTreeTableModel(List<Conti>listaConti) {
        Root = new DefaultMutableTreeTableNode();
        this.setRoot(Root);
        for (Conti conti : listaConti) {
            DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(conti);
            Root.add(node);
            for (Conti contoFiglio : conti.getListaContiFigli()) {
                node.add(new DefaultMutableTreeTableNode(contoFiglio));
            }
        }
    }

    @Override
    public String getColumnName(int column){
        return ColName[column];
    }

    @Override
    public int getColumnCount() {
        return ColName.length;
    }


    @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 new String(c.getDescrizione());
            }
            Conti c = (Conti)((DefaultMutableTreeTableNode)arg0).getUserObject();
            if(c==null)
                return null;
            if (arg1 == 0) {
                return new String(c.getDescrizione());
            }else if (arg1 == 1) {
                return new String(c.getIva()+"");
            }else if (arg1 == 2) {
                return new String(c.getImponibile()+"");
            }else if (arg1 == 3) {
                return new String(c.getTotale()+"");
            }
        }catch(Exception e){
            e.printStackTrace();
        }

        return arg0;
    }
}

此代码尚未运行,因为在第一列中我无法显示描述“Locale或Finestre ....” 但我可以看到像这张照片的对象

enter image description here

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

com.mcsolution.easyMgmt.beans.Conti@19faa8ctoString()类的Conti方法的默认输出(继承自Object)。

尝试覆盖toString()课程中的Conti。例如:

@Override
public String toString(){
    return getDescrizione();
}

但是,鉴于您的代码,我不确定为什么会发生这种情况。您的getValueAt()方法永远不会返回Conti对象...

其他建议:

  • 如果JTreeTable延长JXTreeTable,请不要忘记致电super()
  • 避免使用return new String(c.getTotale()+"");。为什么不只是return c.getTotale()+"";
  • 避免使用return arg0;。你永远不应该处于这种情况,所以只抛出一个IllegalArgumentException。