2017-08-03 3 views
0

J'utilise GridBagLayout pour positionner les composants GUI. J'ai utilisé un Jtable à l'intérieur d'un JFrame. Mais la table ne correspond pas au cadre. Il apparaît comme suit. Quand je fais glisser le cadre, il montre la table.Comment définir la taille de Jtable en utilisant GridBagLayOut

enter image description here

Voici mon code. J'ai utilisé ceci comme un Jframe pop-up à un bouton listner.

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; 

      } 

     } 


} 

Voici ma classe de modèle

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

Comment résoudre ce problème?

+0

Nous ne pouvons pas compiler ce code car nous n'avons pas 'HistroyTableMo del'. Voir [mcve]. – user1803551

Répondre

0

Tout d'abord, vous devez ajouter vos composants et définir le GridBagLayout sur le volet de contenu de JFrame, plutôt que sur le JFrame lui-même. Considérez cette image de la hiérarchie de confinement prises à partir d'un tutoriel Oracle:

Container heirarchy

Vous devez également appellerez pack()après vous avez ajouté vos composants, pas avant:

La méthode pack taille le cadre de sorte que tout son contenu soit égal ou supérieur à leurs tailles préférées. Une alternative à pack est d'établir une taille de trame explicitement en appelant setSize ou setBounds (qui définit également l'emplacement du cadre). En général, l'utilisation de pack est préférable à l'appel de setSize, car pack laisse le gestionnaire de disposition des cadres en charge de la taille de l'image et les gestionnaires de disposition s'adaptent bien aux dépendances de la plate-forme et autres facteurs affectant la taille des composants.

Parce que pack() gère le dimensionnement du JFrame, vous n'avez pas besoin d'appeler explicitement setSize()

Donc, votre code devrait ressembler à:

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 

Et l'interface graphique résultant ressemble à:

GUI result

+0

Cela a bien fonctionné. Merci beaucoup. – user3724599

+1

@ user3724599 Si cette réponse a permis de résoudre votre problème, veuillez envisager de l'accepter en cliquant sur la coche. Cela indique à la communauté au sens large que vous avez trouvé une solution et que vous avez acquis une certaine réputation, ainsi que l'utilisateur qui a fourni la solution. Il n'y a aucune obligation de le faire. – explv