Automatische Anpassung eines JPanels in einem JFrame

smartin123

Mitglied
Hallo,

ich suche jetzt schon seit Tagen und Wochen nach einer Lösung.

Ich habe ein Programm, mit folgender Struktur: (von unten nach oben)
JTable --> JScrollPane --> JPanel --> JFrame

Das JFrame wurde mit Hilfe GridBagLayout aufgebaut.

Nun zu meinem Problem:

Wenn man das JPanel alleine startet und maximiert, wird auch die JTable dementsprechend
vergrößert. Das selbe Ergebnis möchte ich auch im JFrame (Hauptfenster) erreichen.
Bisher wird das JPanel im JFrame nur in die Mitte positioniert und die Größe des JPanels
bleibt gleich.

Möglicherweise fehlen mir noch Kenntnisse, wie das GridBagLayout zu verwenden ist.
Leider habe ich trotz Tutorials und Anleitungen, das nicht hinbekommen.

Hier ist der Quellcode zu einem Programm, das mein Problem darstellt:

Klasse Fenster (JFrame)
Code:
package p15; 

import java.awt.BorderLayout; 
import javax.swing.JPanel; 
import javax.swing.JFrame; 
import java.awt.Rectangle; 
import java.awt.GridBagLayout; 
import java.awt.GridBagConstraints; 
import java.awt.Insets; 

public class Fenster extends JFrame { 

   private static final long serialVersionUID = 1L; 
   private JPanel jContentPane = null; 
   private Panel panel = null; 

   /** 
    * This is the default constructor 
    */ 
   public Fenster() { 
      super(); 
      initialize(); 
   } 

   /** 
    * This method initializes this 
    * 
    * @return void 
    */ 
   private void initialize() { 
      this.setSize(300, 200); 
      this.setContentPane(getJContentPane()); 
      this.setTitle("JFrame"); 
   } 

   /** 
    * This method initializes jContentPane 
    * 
    * @return javax.swing.JPanel 
    */ 
   private JPanel getJContentPane() { 
      if (jContentPane == null) { 
         GridBagConstraints gridBagConstraints = new GridBagConstraints(); 
         gridBagConstraints.insets = new Insets(34, 55, 35, 41); 
         gridBagConstraints.gridy = 0; 
         gridBagConstraints.ipadx = -257; 
         gridBagConstraints.ipady = -315; 
         gridBagConstraints.gridx = 0; 
         jContentPane = new JPanel(); 
         jContentPane.setLayout(new GridBagLayout()); 
         jContentPane.add(getPanel(), gridBagConstraints); 
      } 
      return jContentPane; 
   } 

   /** 
    * This method initializes panel    
    *     
    * @return p15.Panel    
    */ 
   private Panel getPanel() { 
      if (panel == null) { 
         panel = new Panel(); 
      } 
      return panel; 
   } 

   public static void main(String[] args) { 
      Fenster fe = new Fenster(); 
      fe.setVisible(true); 
   } 
}

Klasse Panel (JPanel):

Code:
package p15; 

import java.awt.GridBagLayout; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import java.awt.GridBagConstraints; 

public class Panel extends JPanel { 

   private static final long serialVersionUID = 1L; 
   private JScrollPane jScrollPane = null; 
   private JTable jTable = null; 

   // Die Daten für das Table 
    String[][] data = new String[][]{ 
          {"a", "b", "c", "d"}, 
          {"e", "f", "g", "h"}, 
          {"i", "j", "k", "l"} 
    }; 
      
    // Die Column-Titles 
    String[] title = new String[]{ 
          "A", "B", "C", "D" 
    }; 
   /** 
    * This is the default constructor 
    */ 
   public Panel() { 
      super(); 
      initialize(); 
   } 

   /** 
    * This method initializes this 
    * 
    * @return void 
    */ 
   private void initialize() { 
      GridBagConstraints gridBagConstraints = new GridBagConstraints(); 
      gridBagConstraints.fill = GridBagConstraints.BOTH; 
      gridBagConstraints.gridy = 0; 
      gridBagConstraints.weightx = 1.0; 
      gridBagConstraints.weighty = 1.0; 
      gridBagConstraints.gridx = 0; 
      this.setSize(300, 200); 
      this.setLayout(new GridBagLayout()); 
      this.add(getJScrollPane(), gridBagConstraints); 
   } 

   /** 
    * This method initializes jScrollPane    
    *     
    * @return javax.swing.JScrollPane    
    */ 
   private JScrollPane getJScrollPane() { 
      if (jScrollPane == null) { 
         jScrollPane = new JScrollPane(); 
         jScrollPane.setViewportView(getJTable()); 
      } 
      return jScrollPane; 
   } 

   /** 
    * This method initializes jTable    
    *     
    * @return javax.swing.JTable    
    */ 
   private JTable getJTable() { 
      if (jTable == null) { 
         jTable = new JTable(data, title ); 
      } 
      return jTable; 
   } 

}

Wäre klasse, wenn mir jemand weiterhelfen könnte.

Vielen Dank

vg
ManInBlack
 
Ich habs herausgefunden :)

Hab noch vergessen zu erwähnen, dass ich innerhalb des GridBagLayouts, GridBagConstraints einsetze,
die mir JPanels, JButtons und JLabels formatieren.

Mit Hilfe der fill Methode, wird bei maximieren/minimieren auch die Größe des JPanels innerhalb des JFrames angepasst.

gridBagConstraints.fill = GridBagConstraints.BOTH;

Was mich wundert, wenn ich nun das mit VERTICAL verwendet klappt es nicht.
(gridBagConstraints.fill = GridBagConstraints.VERTICAL;)
Normalerweise müsste doch durch diese Funktion, in die Verticale maximiert werden, oder?

vg
ManInBlack
 
Hi smartin123,
ich würde JFrames, die JPanels aufnehmen sollen, eher mit BorderLayout beglücken. Das hat den Vorteil, dass du z.B. eine Toolbar, eine Statusbar etc gescheit unterbringen kannst.
Das würde also allermeistens bedeuten: Hauptpanel im Center, Toolbar im Norden und Statusbar im Süden...
so man die letzten beiden Komponenten mit dabei haben möchte
 
Zurück