Java JTextfield не учитывает заданную ширину столбца - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь создать форму, и на панели dataIn будет метка с соответствующим текстовым полем для ввода данных пользователем.

Итак, я обнаружил, что GridBagLayout - лучший способ сделать это, но я пока не знаю, как его использовать.

enter image description here

Пока это результат. Вся моя форма BorderLayout, но мы собираемся сосредоточиться только на его северной части, где пользователь будет вводить данные.

Этот контейнер северной части содержит GridLayout с 4 строками и 2 столбцами. Внутри (0,0) этого GridLayout я создал другую панель с GridBagLayout, с JLabel и JTextfield. Идея состоит в том, чтобы этот контейнер был адаптивным и заполнял всю оставшуюся область, которая теперь отображается серым цветом, я хотел бы, чтобы все это было текстовым полем.

Если кто-нибудь может помочь мне научиться делать это с помощью GridBagLayout, я бы очень хотел ценить это. Я знаю, что то, что я делаю, может быть неоптимальным, поэтому я выслушаю лучшие предложения.

Спасибо.

import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import java.awt.Insets;
import java.awt.event.*;

@SuppressWarnings("serial")

public class UserForm extends JFrame {

    public UserForm() {

        // Miscelaneous
        Font font0 = new Font("Tahoma", Font.PLAIN, 12);
        Font font1 = new Font("Tahoma", Font.BOLD, 11);
        Font font2 = new Font("Tahoma", Font.BOLD, 12);

        // Frame layout -> north: data-in form, center: Jtable displayed, south:
        // buttons.
        JPanel mainP = new JPanel(new BorderLayout(5, 25));
        JPanel dataIn = new JPanel(new GridLayout(4, 2, 60, 3));
        JPanel displayT = new JPanel(new BorderLayout(0, 20));
        JPanel buttons = new JPanel(new GridLayout(0, 3, 10, 5));

        // Data-In Form Components
        JLabel idl = new JLabel("Id:");
        JLabel namel = new JLabel("Name:");
        JLabel ln1l = new JLabel("First Lastname:");
        JLabel ln2l = new JLabel("Second Lastname:");
        JLabel agl = new JLabel("Age:");
        JLabel adl = new JLabel("Address:");
        JLabel pnl = new JLabel("Phone Number:");
        JLabel eml = new JLabel("E-Mail:");
        JTextField idtf = new JTextField("");
        JTextField nametf = new JTextField("");
        JTextField ln1tf = new JTextField("");
        JTextField ln2tf = new JTextField("");
        JTextField agtf = new JTextField("");
        JTextField adtf = new JTextField("");
        JTextField pntf = new JTextField("");
        JTextField emtf = new JTextField("");

        // Data-In Form Containers
        JPanel dataId = new JPanel(new GridBagLayout());
        JPanel dataName = new JPanel(new GridBagLayout());
        JPanel dataLN1 = new JPanel(new GridBagLayout());
        JPanel dataLN2 = new JPanel(new GridBagLayout());
        JPanel dataAg = new JPanel(new GridBagLayout());
        JPanel dataAd = new JPanel(new GridBagLayout());
        JPanel dataPN = new JPanel(new GridBagLayout());
        JPanel dataEM = new JPanel(new GridBagLayout());

        // Components into individual containers
        // GridBagLayout Constraints label
        GridBagConstraints c1 = new GridBagConstraints();
        c1.gridx = 0;
        c1.gridy = 0;
        c1.gridwidth = 1; 
        c1.gridheight = 1;
        c1.weightx = 0.5;
        c1.anchor = GridBagConstraints.FIRST_LINE_START;
        c1.insets = new Insets(3,10,0,0);

        // GridBagLayout Constraints tf
        GridBagConstraints c2 = new GridBagConstraints();
        c2.gridx = 1;
        c2.gridy = 0;
        //c2.gridwidth = 4; 
        c2.gridheight = 1;
        c2.weightx = 0.5;
        c2.anchor = GridBagConstraints.WEST;
        c2.insets = new Insets(3,0,0,10);
        c2.fill = GridBagConstraints.HORIZONTAL;

        dataId.add(idl, c1);
        dataId.add(idtf, c2);
        dataName.add(namel, c1);
        dataName.add(nametf, c2);
        dataLN1.add(ln1l, c1);
        dataLN1.add(ln1tf, c2);
        dataLN2.add(ln2l, c1);
        dataLN2.add(ln2tf, c2);
        dataAg.add(agl, c1);
        dataAg.add(agtf, c2);
        dataAd.add(adl, c1);
        dataAd.add(adtf, c2);
        dataPN.add(pnl, c1);
        dataPN.add(pntf, c2);
        dataEM.add(eml, c1);
        dataEM.add(emtf, c2);

        // Miscelaneous
        idl.setFont(font2);
        idtf.setFont(font0);
        namel.setFont(font2);
        nametf.setFont(font0);
        ln1l.setFont(font2);
        ln1tf.setFont(font0);
        ln2l.setFont(font2);
        ln2tf.setFont(font0);
        agl.setFont(font2);
        agtf.setFont(font0);
        adl.setFont(font2);
        adtf.setFont(font0);
        pnl.setFont(font2);
        pntf.setFont(font0);
        eml.setFont(font2);
        emtf.setFont(font0);

        // Set tf editable
        idtf.setEditable(true);
        nametf.setEditable(true);
        ln1tf.setEditable(true);
        ln2tf.setEditable(true);
        agtf.setEditable(true);
        adtf.setEditable(true);
        pntf.setEditable(true);
        emtf.setEditable(true);

        dataIn.add(dataId);
        dataIn.add(dataAg);
        dataIn.add(dataName);
        dataIn.add(dataAd);
        dataIn.add(dataLN1);
        dataIn.add(dataPN);
        dataIn.add(dataLN2);
        dataIn.add(dataEM);

        // JTable Creation
        String[] headline = { "Id", "Name", "First Lastname", "Second Lastname", "Age", "Address", "Phone Number",
                "E-Mail" };
        String[][] data = { { "", "", "", "", "", "", "", "" }, { "", "", "", "", "", "", "", "" } };
        JTable dataShow = new JTable(data, headline);

        // Table Personalization
        dataShow.getTableHeader().setFont(font1);
        new HeaderRenderer(dataShow);

        // Add to container
        JPanel tableP = new JPanel(new BorderLayout(1, 1));
        tableP.add(dataShow.getTableHeader(), BorderLayout.NORTH);
        tableP.add(dataShow, BorderLayout.CENTER);
        JScrollPane sP = new JScrollPane();
        sP.setViewportView(tableP);
        displayT.add(sP, BorderLayout.CENTER);

        // buttons Components and Cointainers
        JButton save = new JButton("Save");
        JButton del = new JButton("Delete");
        JButton edit = new JButton("Edit");
        JLabel empty = new JLabel("");

        // Add to button panel
        buttons.add(save);
        buttons.add(del);
        buttons.add(edit);
        buttons.add(empty);

        // Miscelaneous
        save.setFont(font2);
        del.setFont(font2);
        edit.setFont(font2);

        // Add subpanels to main panel
        mainP.add(dataIn, BorderLayout.NORTH);
        mainP.add(displayT, BorderLayout.CENTER);
        mainP.add(buttons, BorderLayout.SOUTH);

        // set content pane
        setContentPane(mainP);
        setVisible(true);
        setTitle("User Form");
        setSize(900, 500);
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // For future table filling
        /*
         * String ids = idtf.getText(); String names = nametf.getText(); String ln1s =
         * ln1tf.getText(); String ln2s = ln2tf.getText(); String ags = agtf.getText();
         * String ads = adtf.getText(); String pns = pntf.getText(); String ems =
         * emtf.getText();
         */

    }

    public static void main(String[] args) {

        // invoke runnable for thread safety
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new UserForm();
            }
        });

    }

    // LEFT alignment renderer
    private class HeaderRenderer implements TableCellRenderer {

        DefaultTableCellRenderer renderer;

        public HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.LEFT);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int col) {
            return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

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

    JPanel dataName = new JPanel();
    GridBagLayout gbl = new GridBagLayout();
    gbl.columnWidths = new int[]{0, 0};
    gbl.columnWeights = new double[]{0.0, 6.0};
    dataName.setLayout(gbl);

И GridBagConstraints:

    GridBagConstraints c1 = new GridBagConstraints();
    c1.gridx = 0;
    c1.gridy = 0;
    c1.gridwidth = 1;
    c1.gridheight = 1;
    c1.weightx = 1;
    c1.anchor = GridBagConstraints.LINE_START;
    c1.insets = new Insets(3,10,0,0);
    c1.fill = GridBagConstraints.NONE;

    GridBagConstraints c2 = new GridBagConstraints();
    c2.gridx = 1;
    c2.gridy = 0;
    c2.gridwidth = 1;
    c2.gridheight = 1;
    c2.weightx = 1;
    c2.anchor = GridBagConstraints.LINE_START;
    c2.insets = new Insets(3,0,0,10);
    c2.fill = GridBagConstraints.HORIZONTAL;

Для более краткой и модульной реализации вы можете ввести метод:

private JPanel makeWhrapperPane(Component c1, Component c2, GridBagConstraints gbc1, GridBagConstraints gbc2){

    JPanel wrapper = new JPanel();
    GridBagLayout gbl= new GridBagLayout();
    gbl.columnWidths = new int[]{0, 0};
    gbl.columnWeights = new double[]{0.0, 6.0};
    wrapper.setLayout(gbl);
    wrapper.add(c1, gbc1);
    wrapper.add(c2, gbc2);

    return wrapper;
}

И использовать его: JPanel dataName = makeWhrapperPane(namel, nametf, c1, c2);

Ниже приведена полная реализация рекомендованных выше изменений. :

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class UserForm extends JFrame {

    private static final Insets insets = new Insets(10, 10, 10, 10);
    private static final Font font0 = new Font("Tahoma", Font.PLAIN, 12);
    private static final Font font1 = new Font("Tahoma", Font.BOLD, 11);
    private static final Font font2 = new Font("Tahoma", Font.BOLD, 12);
    private final  GridBagConstraints gbc1, gbc2;

    public UserForm() {

        // Frame layout -> north: data-in form, center: Jtable displayed, south:
        // buttons.
        JPanel mainP = new JPanel(new BorderLayout(5, 25));
        JPanel dataIn = new JPanel(new GridLayout(4, 2, 60, 3));
        JPanel displayT = new JPanel(new BorderLayout(0, 20));
        JPanel buttons = new JPanel(new GridLayout(0, 3, 10, 5));

        // Data-In Form Components
        JLabel idl = makeLabel("Id:");
        JLabel namel = makeLabel("Name:");
        JLabel ln1l = makeLabel("First Lastname:");
        JLabel ln2l = makeLabel("Second Lastname:");
        JLabel agl = makeLabel("Age:");
        JLabel adl = makeLabel("Address:");
        JLabel pnl = makeLabel("Phone Number:");
        JLabel eml = makeLabel("E-Mail:");
        JTextField idtf = makeTextField();
        JTextField nametf = makeTextField();
        JTextField ln1tf = new JTextField("");
        JTextField ln2tf = new JTextField("");
        JTextField agtf = new JTextField("");
        JTextField adtf = new JTextField("");
        JTextField pntf = new JTextField("");
        JTextField emtf = new JTextField("");

        gbc1= new GridBagConstraints();
        gbc1.gridx = 0;
        gbc1.gridy = 0;
        gbc1.gridwidth = 1;
        gbc1.gridheight = 1;
        gbc1.weightx = 1;
        gbc1.anchor = GridBagConstraints.LINE_START;
        gbc1.insets = new Insets(3,10,0,0);
        gbc1.fill = GridBagConstraints.NONE;

        gbc2 = new GridBagConstraints();
        gbc2.gridx = 1;
        gbc2.gridy = 0;
        gbc2.gridwidth = 1;
        gbc2.gridheight = 1;
        gbc2.weightx = 1;
        gbc2.anchor = GridBagConstraints.LINE_START;
        gbc2.insets = new Insets(3,0,0,10);
        gbc2.fill = GridBagConstraints.HORIZONTAL;

        dataIn.add(makeWhrapperPane(idl, idtf));
        dataIn.add(makeWhrapperPane(agl, agtf));
        dataIn.add(makeWhrapperPane(namel, nametf));
        dataIn.add(makeWhrapperPane(adl, adtf));
        dataIn.add(makeWhrapperPane(ln1l, ln1tf));
        dataIn.add(makeWhrapperPane(pnl, pntf));
        dataIn.add(makeWhrapperPane(ln2l, ln2tf));
        dataIn.add(makeWhrapperPane(eml, emtf));

        // JTable Creation
        String[] headline = { "Id", "Name", "First Lastname", "Second Lastname", "Age", "Address", "Phone Number",
                "E-Mail" };
        String[][] data = { { "", "", "", "", "", "", "", "" }, { "", "", "", "", "", "", "", "" } };
        JTable dataShow = new JTable(data, headline);

        // Table Personalization
        dataShow.getTableHeader().setFont(font1);
        new HeaderRenderer(dataShow);

        // Add to container
        JPanel tableP = new JPanel(new BorderLayout(1, 1));
        tableP.add(dataShow.getTableHeader(), BorderLayout.NORTH);
        tableP.add(dataShow, BorderLayout.CENTER);
        JScrollPane sP = new JScrollPane();
        sP.setViewportView(tableP);
        displayT.add(sP, BorderLayout.CENTER);

        // buttons Components and Cointainers
        JButton save = makeButton("Save");
        JButton del = makeButton("Delete");
        JButton edit = makeButton("Edit");
        JLabel empty = new JLabel("");

        // Add to button panel
        buttons.add(save);
        buttons.add(del);
        buttons.add(edit);
        buttons.add(empty);

        // Add subpanels to main panel
        mainP.add(dataIn, BorderLayout.NORTH);
        mainP.add(displayT, BorderLayout.CENTER);
        mainP.add(buttons, BorderLayout.SOUTH);

        // set content pane
        setContentPane(mainP);
        setTitle("User Form");
        setSize(900, 500);
        setResizable(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private JTextField makeTextField() {
        JTextField tf = new JTextField("");
        tf.setFont(font0);
        tf.setEditable(true);
        return tf;
    }

    private JLabel makeLabel(String s) {
        JLabel label = new JLabel(s);
        label.setFont(font2);
        return label;
    }

    private JButton makeButton(String s) {
        JButton button = new JButton(s);
        button.setFont(font2);
        return button;
    }

    private JPanel makeWhrapperPane(Component c1, Component c2){
        JPanel wrapper = new JPanel();
        GridBagLayout gbl= new GridBagLayout();
        gbl.columnWidths = new int[]{0, 0};
        gbl.columnWeights = new double[]{0.0, 6.0};
        wrapper.setLayout(gbl);
        wrapper.add(c1, gbc1);
        wrapper.add(c2, gbc2);
        return wrapper;
    }

    public static void main(String[] args) {
        // invoke runnable for thread safety
        SwingUtilities.invokeLater(() -> new UserForm());
    }

    // LEFT alignment renderer
    private class HeaderRenderer implements TableCellRenderer {

        DefaultTableCellRenderer renderer;
        public HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.LEFT);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int col) {
            return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        }
    }
}
0 голосов
/ 18 марта 2020

Вот GUI, который я создал с помощью макета мешка сетки.

User Form

Вот основные изменения, которые я сделал.

  1. Я использовал JFrame. Нет смысла расширять компонент Swing, если вы не собираетесь переопределять один из методов класса.

  2. Я расположил методы JFrame в правильном порядке. Методы JFrame должны вызываться в порядке, указанном в коде.

  3. Я сгруппировал все методы JComponent вместе для каждого JComponent и создал JComponent в порядке их появления в JFrame. Ради любви всех разработчиков, всегда создавайте JComponents в строке, порядке столбцов.

  4. Я удалил все размеры, кроме предпочтительного размера точки обзора JTable.

  5. Я определил ограничения мешка сетки для каждого JComponent. Таким образом, вы можете настроить ограничения для каждого JComponent. Кроме того, я не помню значения по умолчанию.

В этом GUI есть два JPanel. Основной JPanel содержит все JComponents, кроме JButtons. Второй JPanel содержит JButtons. Это потому, что есть 3 кнопки, и я разделил макет мешка сетки на 4 столбца.

Макет мешка сетки использует 4 столбца. JTable занимает все 4 столбца, а также кнопку JPanel.

Вот код.

package com.ggl.testing;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class UserForm {

    // top, left, bottom, right
    private static final Insets topInsets = new Insets(10, 10, 10, 10);
    private static final Insets topCenterInsets = new Insets(10, 0, 10, 10);
    private static final Insets middleInsets = new Insets(0, 10, 10, 10);
    private static final Insets middleCenterInsets = new Insets(0, 0, 10, 10);

    public UserForm() {

        JFrame frame = new JFrame("User Form");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Miscelaneous
        Font plain = new Font("Tahoma", Font.PLAIN, 12);
        Font bold11 = new Font("Tahoma", Font.BOLD, 11);
        Font bold12 = new Font("Tahoma", Font.BOLD, 12);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridBagLayout());

        int gridy = 0;

        // Data-In Form Components
        JLabel idl = new JLabel("Id:");
        idl.setFont(bold12);
        addComponent(mainPanel, idl, 0, gridy, 1, 1, topInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField idtf = new JTextField(40);
        idtf.setFont(plain);
        addComponent(mainPanel, idtf, 1, gridy, 1, 1, topCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel agl = new JLabel("Age:");
        agl.setFont(bold12);
        addComponent(mainPanel, agl, 2, gridy, 1, 1, topCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField agtf = new JTextField(40);
        agtf.setFont(plain);
        addComponent(mainPanel, agtf, 3, gridy++, 1, 1, topCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel namel = new JLabel("Name:");
        namel.setFont(bold12);
        addComponent(mainPanel, namel, 0, gridy, 1, 1, middleInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField nametf = new JTextField(40);
        nametf.setFont(plain);
        addComponent(mainPanel, nametf, 1, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel adl = new JLabel("Address:");
        adl.setFont(bold12);
        addComponent(mainPanel, adl, 2, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField adtf = new JTextField(40);
        adtf.setFont(plain);
        addComponent(mainPanel, adtf, 3, gridy++, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel pnl = new JLabel("Phone Number:");
        pnl.setFont(bold12);
        addComponent(mainPanel, pnl, 0, gridy, 1, 1, middleInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField pntf = new JTextField(40);
        pntf.setFont(plain);
        addComponent(mainPanel, pntf, 1, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel ln1l = new JLabel("First Lastname:");
        ln1l.setFont(bold12);
        addComponent(mainPanel, ln1l, 2, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField ln1tf = new JTextField(40);
        ln1tf.setFont(plain);
        addComponent(mainPanel, ln1tf, 3, gridy++, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel ln2l = new JLabel("Second Lastname:");
        ln2l.setFont(bold12);
        addComponent(mainPanel, ln2l, 0, gridy, 1, 1, middleInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField ln2tf = new JTextField(40);
        ln2tf.setFont(plain);
        addComponent(mainPanel, ln2tf, 1, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        JLabel eml = new JLabel("E-Mail:");
        eml.setFont(bold12);
        addComponent(mainPanel, eml, 2, gridy, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.NONE);

        JTextField emtf = new JTextField(40);
        emtf.setFont(plain);
        addComponent(mainPanel, emtf, 3, gridy++, 1, 1, middleCenterInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        // JTable Creation
        String[] headline = { "Id", "Name", "First Lastname", "Second Lastname", "Age", "Address", "Phone Number",
                "E-Mail" };
        String[][] data = { { "", "", "", "", "", "", "", "" }, { "", "", "", "", "", "", "", "" } };
        JTable dataShow = new JTable(data, headline);
        dataShow.setPreferredScrollableViewportSize(new Dimension(900, 300));
        dataShow.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(dataShow);
        addComponent(mainPanel, scrollPane, 0, gridy++, 4, 1, middleInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);


        // Table Personalization
        dataShow.getTableHeader().setFont(bold11);
        new HeaderRenderer(dataShow);

        // buttons Components 
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridBagLayout());
        JButton save = new JButton("Save");
        save.setFont(bold12);
        addComponent(buttonPanel, save, 0, 0, 1, 1, topInsets, GridBagConstraints.CENTER,
                GridBagConstraints.HORIZONTAL);

        JButton del = new JButton("Delete");
        del.setFont(bold12);
        addComponent(buttonPanel, del, 1, 0, 1, 1, topInsets, GridBagConstraints.CENTER,
                GridBagConstraints.HORIZONTAL);

        JButton edit = new JButton("Edit");
        edit.setFont(bold12);
        addComponent(buttonPanel, edit, 2, 0, 1, 1, topInsets, GridBagConstraints.CENTER,
                GridBagConstraints.HORIZONTAL);

        addComponent(mainPanel, buttonPanel, 0, gridy++, 4, 1, middleInsets, GridBagConstraints.LINE_START,
                GridBagConstraints.HORIZONTAL);

        // set content pane
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        // For future table filling
        /*
         * String ids = idtf.getText(); String names = nametf.getText(); String ln1s =
         * ln1tf.getText(); String ln2s = ln2tf.getText(); String ags = agtf.getText();
         * String ads = adtf.getText(); String pns = pntf.getText(); String ems =
         * emtf.getText();
         */

    }

    private void addComponent(Container container, Component component, int gridx, int gridy, int gridwidth,
            int gridheight, Insets insets, int anchor, int fill) {
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0, anchor, fill,
                insets, 0, 0);
        container.add(component, gbc);
    }

    public static void main(String[] args) {

        // invoke runnable for thread safety
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new UserForm();
            }
        });

    }

    // LEFT alignment renderer
    private class HeaderRenderer implements TableCellRenderer {

        DefaultTableCellRenderer renderer;

        public HeaderRenderer(JTable table) {
            renderer = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
            renderer.setHorizontalAlignment(JLabel.LEFT);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int col) {
            return renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        }

    }

}
...