Search code examples
javaswingjframejtablejtableheader

Table won't show header and resize


Trying to make frame that looks something like this: Class methods table

This is what I've wrote so far:

public class Dialog {

private JFrame frame;
private JPanel labelPanel;
private JPanel buttonPanel;
private JButton button1;
private JButton button2;
private JTable table;
private JLabel label;

private static final String methodHeader = "Method";
private static final String parametersHeader = "Parameters";
private static final String resultHeader = "Result";

public Dialog(List<MethodDescriptor> methodList) {
    gui(methodList);
}

public void gui(List<MethodDescriptor> methodList) {

    /* Initialisation */
    DefaultTableModel headerData = new DefaultTableModel();
    DefaultTableModel data = new DefaultTableModel();
    headerData.addColumn(methodHeader);
    headerData.addColumn(parametersHeader);
    headerData.addColumn(resultHeader);

    /* Add data to table */
    for (int i = 0; i < methodList.size(); i++) {
        int itterator = 1;
        String methodName = methodList.get(i).getMethodName() + "(";
        List<ParameterDescriptor> paramList = methodList.get(i).getParamsList();
        for (ParameterDescriptor param : paramList) {
            methodName += param.getParamType() + " " + param.getParamName();
            if (itterator++ != paramList.size()) {
                methodName += ", ";
            }
        }
        methodName += ")";
        headerData.addRow(new Object[] { methodName });

        Vector v = new Vector();

        data.addRow(v);
    }

    JTable table = new JTable(data) {
    @Override
               public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
           Component component = super.prepareRenderer(renderer, row, column);
           int rendererWidth = component.getPreferredSize().width;
           TableColumn tableColumn = getColumnModel().getColumn(column);
           tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
           return component;
        }
    };
    //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    JTable rowHeader = new JTable(headerData) {

    @Override
       public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
           Component component = super.prepareRenderer(renderer, row, column);
           int rendererWidth = component.getPreferredSize().width;
           TableColumn tableColumn = getColumnModel().getColumn(column);
           tableColumn.setPreferredWidth(Math.max(rendererWidth + getIntercellSpacing().width, tableColumn.getPreferredWidth()));
           return component;
        }
    };
    rowHeader.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

    rowHeader.setIntercellSpacing(new Dimension(0, 0));
    Dimension d = rowHeader.getPreferredScrollableViewportSize();
    d.width = rowHeader.getPreferredSize().width;
    rowHeader.setPreferredScrollableViewportSize(d);
    rowHeader.setRowHeight(table.getRowHeight());

    JScrollPane scrollPane = new JScrollPane(table);

    scrollPane.setRowHeaderView(rowHeader);

    JTableHeader corner = rowHeader.getTableHeader();
    corner.setReorderingAllowed(false);
    corner.setResizingAllowed(false);
    scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, corner);


    // rowHeader.setDefaultRenderer(Object.class, new RowHeaderRenderer());

    frame = new JFrame();
    frame.setLayout(new BorderLayout());

    // table = new JTable(mColumns, mColumnNames);

    buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
    labelPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));

    button1 = new JButton("Cancel");
    button2 = new JButton("Ok");
    label = new JLabel(
            "Please add parameters and expected values for listed methods you would like to generate Unit tests for");

    /* Adding components to panel */
    buttonPanel.add(button1);
    buttonPanel.add(button2);
    labelPanel.add(label);

    /* Adding panels to frame */
    frame.add(labelPanel, BorderLayout.NORTH);
    frame.add(scrollPane, BorderLayout.CENTER);
    frame.add(buttonPanel, BorderLayout.SOUTH);

    frame.setTitle("Unit test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();

    frame.setVisible(true);

}

Ok so this methodList, is a list that contains 1. method name 2. list of method parameters. Problem is I can't get header strings to appear and also my table is fixed on some size, don't know what size it is and how to modify it. Method list is not always the same. It depends on what class is selected. Because of this I need my table to resize it self, if there is more methods or if name of method + parameters is longer, to fit cell. So for now I have two problems : 1. Headers won't appear 2. Cells won't resize properly this is what I get:Table so far

I've added ScrollPane so it should work, but it doesn't. I looked at other solutions on stackoverflow but nothing helped.


Solution

  • Tried to improve your code. At least it shows now a Table:

    import javax.swing.*;
    import javax.swing.table.DefaultTableModel;
    import java.awt.*;
    import java.beans.*;
    import java.lang.reflect.Method;
    import java.lang.reflect.Parameter;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Vector;
    
    public class Dialog {
    
        private JFrame frame;
        private JPanel labelPanel;
        private JPanel buttonPanel;
        private JButton button1;
        private JButton button2;
        private JTable table;
        private JLabel label;
    
        private static final String methodHeader = "Method";
        private static final String parametersHeader = "Parameters";
        private static final String resultHeader = "Result";
    
        public Dialog(List<Method> methodList) {
            gui(methodList);
        }
    
        public void gui(List<Method> methodList) {
    
            /* Initialisation */
            DefaultTableModel data = new DefaultTableModel();
            data.addColumn(methodHeader);
            data.addColumn(parametersHeader);
            data.addColumn(resultHeader);
    
            /* Add data to table */
            for (int i = 0; i < methodList.size(); i++) {
                Vector v = new Vector();
                Method method = methodList.get(i);
                v.add(method.getName());
                String params = "";
                for (Parameter param : method.getParameters()) {
                    params = param + ", " + param.getType() + " " + param.getName();
                }
    
                v.add(params);
                v.add(method.getReturnType());
    
                data.addRow(v);
            }
    
            JTable table = new JTable(data);
            JScrollPane scrollPane = new JScrollPane(table);
    
    
            frame = new JFrame();
            frame.setLayout(new BorderLayout());
    
            // table = new JTable(mColumns, mColumnNames);
    
            buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
            labelPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
    
            button1 = new JButton("Cancel");
            button2 = new JButton("Ok");
            label = new JLabel(
                    "Please add parameters and expected values for listed methods you would like to generate Unit tests for");
    
            /* Adding components to panel */
            buttonPanel.add(button1);
            buttonPanel.add(button2);
            labelPanel.add(label);
    
            /* Adding panels to frame */
            frame.add(labelPanel, BorderLayout.NORTH);
            frame.add(scrollPane, BorderLayout.CENTER);
            frame.add(buttonPanel, BorderLayout.SOUTH);
    
            frame.setTitle("Unit test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
    
            frame.setVisible(true);
    
        }
    
        public static void main(String[] args) throws IntrospectionException {
    
            new Dialog(Arrays.asList(Dialog.class.getMethods()));
        }
    }