如何使用 GridBagLayOut 将大小设置为 Jtable

How to set size to Jtable using GridBagLayOut

我正在使用 GridBagLayout 来定位 GUI 组件。我在 JFrame 中使用了 Jtable。但是 table 不适合框架。显示如下。当我拖动框架时,它显示 table.

这是我的代码。我将其用作按钮监听器的弹出 Jframe。

public class ViewPrescriptionHistory extends JFrame{

    private GridBagConstraints gridbBagConstraints;
    private JTable drugDetailsTable;
    HistroyTableModel drugDetailsTabelModel = new HistroyTableModel();

    public ViewPrescriptionHistory() {
        this.setLayout(new GridBagLayout());
        this.setSize(500, 500);

        this.pack();
        initialize();
    }

    private void initialize() {
        gridbBagConstraints = new GridBagConstraints();
        gridbBagConstraints.insets = new Insets(10, 0, 10, 0);
        gridbBagConstraints.ipady = 10;
        gridbBagConstraints.ipadx = 10;

        drugDetailsTable = new JTable(drugDetailsTabelModel);
        drugDetailsTable.setPreferredScrollableViewportSize(new Dimension(600, 100));
        drugDetailsTable.setFillsViewportHeight(true);

        JScrollPane scrollPane = new JScrollPane(drugDetailsTable);
        scrollPane.setBounds(5, 218, 884, 194);


        this.add(scrollPane);

    }
}

Here is my table model. I used Abstract Table model.

    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.table.AbstractTableModel; 
    import assignment3.prescriptionsystem.model.HistoryModel;

    public class HistroyTableModel extends AbstractTableModel{

        private String[] columnNames = { "Doctor Name", "Date", "Drug Name", "Form" , "Dosage" };
        List<HistoryModel> historyList = new ArrayList<HistoryModel>();

        public String getColumnName(int column) {
            return columnNames[column];

        }

        public int getColumnCount() {

            return columnNames.length;
        }

        public int getRowCount() {

            return historyList.size();
        }

        public void reloadDrugList(List<HistoryModel> drugsData) {
            historyList= drugsData;
            fireTableDataChanged();
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            HistoryModel drugData = historyList.get(rowIndex);
            switch (columnIndex) {
            case 0:
                return drugData.getDocName();
            case 1:
                return drugData.getDate();
            case 2:
                return drugData.getDrugName();
            case 3:
                return drugData.getFrom();
            case 4:
                return drugData.getDosage();
            default:
                return null;

            }

        }


}

这是我的模型class

public class HistoryModel {
    String docName;
    String date;
    String drugName;
    String dosage;
    String from;
    public String getDocName() {
        return docName;
    }
    public void setDocName(String docName) {
        this.docName = docName;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getDrugName() {
        return drugName;
    }
    public void setDrugName(String drugName) {
        this.drugName = drugName;
    }
    public String getDosage() {
        return dosage;
    }
    public void setDosage(String dosage) {
        this.dosage = dosage;
    }
    public String getFrom() {
        return from;
    }
    public void setFrom(String from) {
        this.from = from;
    }
}

如何解决这个问题?

首先,您应该将组件添加到 JFrame 的 内容窗格 ,而不是 JFrame 本身,并将 GridBagLayout 设置为开启。考虑从 Oracle 教程中获取的包含层次结构的图像:

您还应该在添加组件之后调用pack()而不是在之前:

pack 方法调整框架大小,使其所有内容都达到或超过其首选大小。 pack 的另一种方法是通过调用 setSize 或 setBounds(它也设置帧位置)显式建立帧大小。通常,使用 pack 比调用 setSize 更可取,因为 pack 让框架布局管理器负责框架大小,而布局管理器擅长调整平台依赖性和其他影响组件大小的因素。

因为 pack() 处理 JFrame 的大小,您不需要显式调用 setSize()

因此您的代码应如下所示:

getContentPane().setLayout(new GridBagLayout()); // Set the layout on the content pane rather than the JFrame

gridbBagConstraints = new GridBagConstraints();
gridbBagConstraints.insets = new Insets(10, 0, 10, 0);
gridbBagConstraints.ipady = 10;
gridbBagConstraints.ipadx = 10;

drugDetailsTable = new JTable(drugDetailsTabelModel);
drugDetailsTable.setPreferredScrollableViewportSize(new Dimension(600, 100));
drugDetailsTable.setFillsViewportHeight(true);

JScrollPane scrollPane = new JScrollPane(drugDetailsTable);
scrollPane.setBounds(5, 218, 884, 194);

getContentPane().add(scrollPane); // Add the scroll pane to the content pane rather than the JFrame

pack(); // Call pack at the end

生成的 GUI 如下所示: