Таблица не будет отображать заголовок и изменять размер - PullRequest
0 голосов
/ 03 мая 2018

Попытка сделать кадр, который выглядит примерно так: Таблица методов класса

Вот что я написал до сих пор:

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);

}

Хорошо, этот methodList представляет собой список, содержащий 1. имя метода 2. список параметров метода. Проблема в том, что я не могу отобразить строки заголовка, а также моя таблица имеет фиксированный размер, не знаю, какой это размер и как его изменить. Список методов не всегда одинаков. Это зависит от того, какой класс выбран. Из-за этого мне нужно, чтобы моя таблица самостоятельно меняла размеры, если есть больше методов или если имя метода + параметры длиннее, чтобы соответствовать ячейке. Итак, сейчас у меня есть две проблемы: 1. Заголовки не появятся 2. Ячейки не изменят размеры должным образом вот что я получаю: Таблица пока

Я добавил ScrollPane, чтобы он работал, но это не так. Я смотрел на другие решения на stackoverflow, но ничего не помогло.

1 Ответ

0 голосов
/ 03 мая 2018

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

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()));
    }
}
...