2017-08-03 105 views
0

我正在使用GridBagLayout来定位GUI组件。我在JFrame中使用了Jtable。但桌子不适合框架。它显示如下。当我拖动框架时,它会显示表格。如何使用GridBagLayOut将大小设置为Jtable

enter image description here

这里是我的代码。我用它作为弹出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; 
    } 
} 

如何解决这个问题?

+0

我们不能编译这段代码,因为我们没有'HistroyTableMo del'。见[mcve]。 – user1803551

回答

0

首先,您应该将您的组件添加到JFrame的内容窗格上,并将其设置为GridBagLayout,而不是JFrame本身。考虑从Oracle教程所采取的围堵层次图像:

Container heirarchy

你也应该调用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的样子:

GUI result

+0

它工作正常。非常感谢你。 – user3724599

+1

@ user3724599如果这个答案已经解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,您已经找到了解决方案,并为您提供了一些信誉,并为提供解决方案的用户提供了一些信誉。没有义务这样做。 – explv

相关问题