Как поместить JTable в JTree / Cell - PullRequest
0 голосов
/ 30 марта 2020

Я нашел эту тему: Поместите JTable в JTree , и это не работает для меня. Как я могу «изменить» размер JTable в JTree, чтобы он соответствовал ширине? Внешняя JFrame имеет ширину 800 пикселей, как я могу сказать, что JTree использует это горизонтальное пространство, даже когда JFrame меняет свой размер? Так как я могу применить макет?

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;

public class Main2 {
    JRadioButton b1 = new JRadioButton("One");
    JRadioButton b2 = new JRadioButton("Two");
    ButtonGroup bg1 = new ButtonGroup();

    DefaultMutableTreeNode root = new DefaultMutableTreeNode(new Mail("a.b@c", "d.e@f", "s", "01"));
    DefaultTreeModel dtm = new DefaultTreeModel(root);
    JTree tt = new JTree(dtm);

    class Mail {
        String f, t, s, d;

        Mail(String f, String t, String s, String d) {
            this.f = f;
            this.t = t;
            this.s = s;
            this.d = d;
        }
    }

    class MyTableInTreeCellRenderer implements TreeCellRenderer {
        private JTable t = new JTable();

        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
                boolean leaf, int row, boolean hasFocus) {
            Mail v = (Mail) ((DefaultMutableTreeNode) value).getUserObject();
            t.setModel(new DefaultTableModel(new Object[][] { { v.f, v.t, v.s, v.d } },
                    new Object[] { "f", "t", "s", "d" }));
            t.setTableHeader(null);
            t.setPreferredSize(new Dimension(750, 20)); // How to set Layout with effect?
            return t;
        }
    }

    public Main2() {
        b1.setSelected(true);
        bg1.add(b1);
        bg1.add(b2);
        root.add(new DefaultMutableTreeNode(new Mail("a.b@c", "d.e@f", "s", "02")));
        root.add(new DefaultMutableTreeNode(new Mail("a.b@c", "d.e@f", "s", "03")));
        tt.setCellRenderer(new MyTableInTreeCellRenderer());

        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(2, 1));
        p1.add(b1);
        p1.add(b2);

        JFrame jf = new JFrame();
        jf.setLayout(new BorderLayout());
        jf.add(p1, BorderLayout.NORTH);
        jf.add(new JScrollPane(tt), BorderLayout.CENTER);
        jf.setSize(800, 400);
        jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        jf.setVisible(true);
    }

    public static void main(String[] args) {
        new Main2();
    }
}
...