Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Таблица - элемент дерева


Автор: marik86 30.9.2008, 21:46
Всем привет! Разрабатываю дерево, элементами которого являеются таблицы. Т.е. при развертывании ноды, открывается список таблиц. Прикрепил код, который делаю. Что-то не работает. А именно не отображаются таблицы в дереве.
Если в двух словах, то делаю так. Переопеределяю класс JTree, в нем же переопределяю TreeCellRenderer.


Пожалуйста помогите!!!!!!!!!!!!!!!!!!!!!!!

Автор: marik86 1.10.2008, 10:53
Может так проще будет.

package treetable;

import javax.swing.JTable;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
/**
 *
 * @author  tb
 */
public class jFrame extends javax.swing.JFrame {

    /** Creates new form jFrame */
    public jFrame() {
        initComponents();
        JTable table = new JTable(new String [][]{{"1", "2"}, {"3", "4"}}, new String [] {"c1", "c2"});
        DefaultMutableTreeNode main = new DefaultMutableTreeNode("main");
        main.add(new DefaultMutableTreeNode(table));
        JTreeTable tree = new JTreeTable();
        tree.setModel(new DefaultTreeModel(main));
        jScrollPane1.setViewportView(tree);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(66, 66, 66)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 393, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(42, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(62, 62, 62)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 241, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(106, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new jFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration

}


---------------------------------------------------------------------


package treetable;

import java.awt.Component;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;

/**
 *
 * @author tb
 */
public class JTreeTable extends javax.swing.JTree{ 
    
    public JTreeTable(){
        super();
        this.setCellRenderer(new JTreeCellRendererExt());
    }
    
    public JTreeTable(DefaultTreeModel model){
        super(model);
        this.setCellRenderer(new JTreeCellRendererExt());
    }
    
    private DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
    
    public class JTreeCellRendererExt extends javax.swing.JTable
            implements javax.swing.tree.TreeCellRenderer{

        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, 
                boolean leaf, int row, boolean hasFocus) {            
            if (!(value instanceof javax.swing.JTable))
                return renderer.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
            return this;
        }
    }  
}

Автор: marik86 1.10.2008, 12:46
Люди, неужели никто не знает, как быть в данном случае? =)))

Автор: dorogoyIV 4.10.2008, 19:21
чо то не получается  smile  , мож кто подскажет?

здесь надо три раза мышкой по листу щелкнуть, что бы таблица появилась:
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class MyTree extends JFrame
{
 public MyTree()
 {
  JTree tree = new JTree();
  tree.setEditable(true);

  DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();

  MyEditor editor = new MyEditor(new JTable(2, 3));

  DefaultTreeCellEditor treeEditor =
          new DefaultTreeCellEditor(tree, renderer, editor);
  tree.setCellEditor(treeEditor);
  getContentPane().add(new JScrollPane(tree));
 }

 public static void main(String [] args)
 {
  JFrame f = new MyTree();
  f.setBounds(100, 100, 400, 300);
  f.setDefaultCloseOperation(3);
  f.setVisible(true);
 }
}

class MyEditor extends AbstractCellEditor
               implements TreeCellEditor
{
 JTable table;

 public MyEditor(JTable table)
 {
  this.table = table;
 }

 public Object getCellEditorValue()
 {
  return null;
 }

 public Component getTreeCellEditorComponent(JTree tree, Object value,
              boolean isSelected, boolean expanded, boolean leaf, int row)
 {
  if(leaf)
   return table;
  else
   return new JLabel(value.toString());
 }
}

Автор: Connie 6.10.2008, 19:40
dorogoyIV, 
Цитата
здесь надо три раза мышкой по листу щелкнуть, что бы таблица появилась:
проще F2 нажать, но объясните мне, Холмс, от куда там, в том коротком примере взялись узлы дерева с именами colors, sports, food? А в них листы так же с именами?  smile 

Автор: Старовъръ 6.10.2008, 19:45
Это стандартно делается, если дерево пустое. Наверное, что-то вроде демонстрации работы.

Автор: Lisus 6.10.2008, 22:20
Цитата(Старовъръ @  6.10.2008,  19:45 Найти цитируемый пост)
Это стандартно делается, если дерево пустое. Наверное, что-то вроде демонстрации работы.


Абсолютно верно.
Это дефалтовый набор узлов.
Если он тебе не нравиться создавай дерево с указанием своего коня.

Автор: Connie 8.10.2008, 10:41
Вот чего нашел
user posted image
http://java-treetable.vista-files.org/
Но это платная библиотека, как я понял

И вот
http://java.sun.com/products/jfc/tsc/articles/treetable1/

может поможет?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)