2012-01-12 20 views
8

Wiem, że można utworzyć table and add a JTree as a column. Ale to, co chcę zrobić, to zupełne przeciwieństwo.Jtable jako węzeł Jtree

Sprawdź zdjęcie i powiedz, czy jest to możliwe. Dzięki!

enter image description here

UPDATE:

przy użyciu kodu MKorbel i przez losowanie liczbę kolumn z następującego kodu:

@Override 
public int getColumnCount() { 
    int i = (int) (Math.random()* 10.0); 
    if (i%2 ==0) 
     return 2; 
    else 
     return 3; 
} 

udało mi się następujący obraz:

enter image description here

+1

Nie testowałem tego, ale dlaczego nie powinno to być możliwe. Interfejs API żąda, aby mechanizm renderujący zwrócił komponent. I JTable jest składnikiem. Edycja/wybieranie w JTable może być trudniejsze – Robin

+0

@Robin Ale mam na myśli wizualnie, czy to jest właściwe? Czy przedstawia jakiekolwiek trudności? –

+0

To jest interesujące. Moje 2 centy: Po prostu czuję się wizualnie, jeśli twoje stoły są duże, twoje drzewo może wyglądać na funky. Ponadto jestem ciekawy, czy rzeczywiście będziesz w stanie wchodzić w interakcje ze stołem. Czy byłby to tylko obraz stołu? – user489041

Odpowiedz

7

1) nie rozwiązuje isLeaf() w Renderer i Editor jakoś

2) jeśli umieścić JScrollPane z JTable do Node bezpośrednio (bez użycia JPanel jak parent), a następnie JTree View nieprawidłowo odtworzonej po start_up dla więcej informacji zobacz moje pytanie Put JTable in the JTree

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

public class TreeWithTableRenderer extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTree tree; 

    public TreeWithTableRenderer() { 
     DefaultMutableTreeNode AA1 = new DefaultMutableTreeNode("AA1"); 
     DefaultMutableTreeNode AA2 = new DefaultMutableTreeNode("AA2"); 
     DefaultMutableTreeNode A = new DefaultMutableTreeNode("A"); 
     A.add(AA1); 
     A.add(AA2); 
     DefaultMutableTreeNode BB1 = new DefaultMutableTreeNode("BB1"); 
     DefaultMutableTreeNode BB2 = new DefaultMutableTreeNode("BB2"); 
     DefaultMutableTreeNode B = new DefaultMutableTreeNode("B"); 
     B.add(BB1); 
     B.add(BB2); 
     DefaultMutableTreeNode CC1 = new DefaultMutableTreeNode("CC1"); 
     DefaultMutableTreeNode CC2 = new DefaultMutableTreeNode("CC2"); 
     DefaultMutableTreeNode C = new DefaultMutableTreeNode("C"); 
     C.add(CC1); 
     C.add(CC2); 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
     root.add(A); 
     root.add(B); 
     root.add(C); 
     tree = new JTree(root); 
     tree.setCellRenderer(new MyTableInTreeCellRenderer()); 
     tree.setRowHeight(0); 
     JScrollPane jsp = new JScrollPane(tree); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(jsp, BorderLayout.CENTER); 
     pack(); 
     setLocationRelativeTo(null); 
    } 

    class MyTableInTreeCellRenderer extends JPanel implements TreeCellRenderer { 

     private static final long serialVersionUID = 1L; 
     private JTable table; 

     public MyTableInTreeCellRenderer() { 
      super(new BorderLayout()); 
      table = new JTable(); 
      JScrollPane scrollPane = new JScrollPane(table); 
      add(scrollPane); 
     } 

     public Component getTreeCellRendererComponent(JTree tree, Object value, 
       boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
      final String v = (String) ((DefaultMutableTreeNode) value).getUserObject(); 
      table.setModel(new DefaultTableModel() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public int getRowCount() { 
        return 2; 
       } 

       @Override 
       public int getColumnCount() { 
        return 2; 
       } 

       @Override 
       public Object getValueAt(int row, int column) { 
        return v + ":" + row + ":" + column; 
       } 
      }); 
      table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
      return this; 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       new TreeWithTableRenderer().setVisible(true); 
      } 
     }); 
    } 
} 
+0

Dziękuję za twój kod. Zmodyfikowałem go trochę, aby uzyskać zaktualizowany wynik w moim pytaniu. Zastanawiałem się tylko, czy to, co zmodyfikowałem, najlepszym sposobem na zrobienie tego? –

+0

Ale tabela nie jest edytowalna. Jak edytować zawartość tabeli – Madhan