2012-01-12 42 views
8

Tôi biết bạn có thể tạo table and add a JTree as a column. Nhưng điều tôi muốn làm là hoàn toàn ngược lại.Jtable dưới dạng nút Jtree Node

Kiểm tra hình ảnh và cho tôi biết nếu điều này là có thể. Cảm ơn!

enter image description here

UPDATE:

Bằng cách sử dụng mã MKorbel và do ngẫu nhiên số cột với đoạn mã sau:

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

tôi đã có thể để có được những hình ảnh sau đây:

enter image description here

+1

Tôi chưa thử nghiệm, nhưng tại sao điều này không thể thực hiện được. API yêu cầu trình kết xuất trả về một thành phần. Và một JTable là một thành phần. Chỉnh sửa/lựa chọn trong JTable có thể khó khăn hơn – Robin

+0

@Robin Nhưng tôi có nghĩa là trực quan, nó có thích hợp không? Nó có gây ra bất kỳ khó khăn nào không? –

+0

Điều này thật thú vị. 2 xu của tôi: Tôi chỉ cảm thấy như trực quan nếu bàn của bạn lớn, cây của bạn có thể trông khá sôi nổi. Ngoài ra, tôi tò mò về việc liệu bạn có thực sự có thể tương tác với bảng hay không. Nó sẽ chỉ là một hình ảnh của bảng? – user489041

Trả lời

7

1) Tôi đã không giải quyết isLeaf() trong RendererEditor bằng cách nào đó

2) nếu tôi đặt JScrollPane với JTable đến Node trực tiếp, (không sử dụng JPanel như parent) sau đó JTree View không trả lại một cách chính xác sau khi start_up cho thêm thông tin, vui lòng xem câu hỏi của tôi 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

Cảm ơn bạn đã viết mã. Tôi đã sửa đổi nó một chút để có được kết quả cập nhật trong câu hỏi của tôi. Tôi chỉ tự hỏi liệu những gì tôi đã sửa đổi với cách tốt nhất để làm điều đó? –

+0

Nhưng Bảng không thể chỉnh sửa. Làm cách nào để chỉnh sửa nội dung của bảng – Madhan

Các vấn đề liên quan