如何使用GridBagLayOut将大小设置为Jtable
我正在使用GridBagLayout来定位GUI组件。我在JFrame中使用了Jtable。但桌子不适合框架。它显示如下。当我拖动框架时,它会显示表格。如何使用GridBagLayOut将大小设置为Jtable
这里是我的代码。我用它作为弹出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;
}
}
}
这里是我的模型类
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的内容窗格上,并将其设置为GridBagLayout,而不是JFrame本身。考虑从Oracle教程所采取的围堵层次图像:
你也应该调用pack()
后您添加了组件,不前:
Pack方法调整框架的大小以使其所有内容达到或超过其首选大小。 pack的一个替代方法是通过调用setSize或setBounds(它也设置帧的位置)来显式地建立一个帧的大小。一般来说,使用包比调用setSize更好,因为包离开了框架布局管理器负责框架大小,并且布局管理器善于调整平台依赖性和影响组件大小的其他因素。
因为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的样子:
它工作正常。非常感谢你。 – user3724599
@ user3724599如果这个答案已经解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,您已经找到了解决方案,并为您提供了一些信誉,并为提供解决方案的用户提供了一些信誉。没有义务这样做。 – explv
我们不能编译这段代码,因为我们没有'HistroyTableMo del'。见[mcve]。 – user1803551