Formular ändert ungewollt seine Abmessung

enrix

Mitglied
Hallo Leute,
ich habe ein Formular mit dem GridBagLayout-Manager geschrieben. Soweit funktioniert auch alles, wäre da nicht ein kleiner Schönheitsfehler. Ich füge nach dem klickes des Buttons ein JTable dem Formular hinzu. Dummerweise verändern sich die Maße des Formulars. Statt schlank und rank ist es nun klein und in die länge gezogen.

Hier wird das Formular in der main-Methode erzeugt:

Code:
  public static void main(String[] args) {
        // TODO code application logic here
        Form Form1 = new Form();
        Form1.init();
        Form1.setVisible(true);
        Form1.setLocation(100, 100);
        Form1.setSize(500,700);    
        }

hier ein kleiner ausschnitt des Formulars bevor man auf dem button klickt. Eigentlich alles nichts was man durchblicken müsste. Der teil funktioniert ja tadellos

Code:
    private GridBagConstraints build_c(int gx, int gy, int gw, int gh, int wx, int wy){
   GridBagConstraints gbc = new GridBagConstraints();
   //Wo soll die Komponente plaziert werden
   gbc.gridx = gx;
   gbc.gridy = gy;
   //wie viele Zellen soll die Kompinente einnehmen
   gbc.gridwidth = gw;
   gbc.gridheight = gh;
   gbc.weightx = wx;
   gbc.weighty = wy;

   return gbc;
  }


    public Form() {

    }
    
    public void init(){
         
        setBackground(Color.MAGENTA);

        setLayout(L);
        c = build_c(0,0,1,3,100,0);
        c.fill = GridBagConstraints.BOTH;
        L.setConstraints(Edit1, c);
        add(Edit1);

        //Zwei AusgabeFelder
        c = build_c(1,0,1,1,0,0);
        c.fill=GridBagConstraints.NONE;
        JLabel l_dez = new JLabel("Dezimal");
        L.setConstraints(l_dez, c);
        add(l_dez);

        c = build_c(1,1,1,1,0,0);
        c.fill=GridBagConstraints.NONE;
        JLabel l_bin = new JLabel("Binary");
        L.setConstraints(l_bin, c);
        add(l_bin);

        //zwei Textfelder
         c = build_c(2,0,1,1,100,0);
        c.fill=GridBagConstraints.HORIZONTAL;
        L.setConstraints(Edit2, c);
        add(Edit2);

        c = build_c(2,1,1,1,100,0);
        c.fill=GridBagConstraints.HORIZONTAL;
        L.setConstraints(Edit3, c);
        add(Edit3);

        //Button
        But.addActionListener(new FormListener(this));        
        c = build_c(0,4,1,1,20,0);
        c.fill=GridBagConstraints.LINE_START;
        L.setConstraints(But, c);
        add(But);

Klickt man nun auf dem Button so übergibt der Button ein actionevent zum FormListener (hier nicht dargestellt) dort wird mit einer geeigneten Methode
das Ausgangsformular durch ein JTable ergänzt. Wie gesagt, leider so, dass die Formularform sich verändert.

Code:
    }


 public void setAbakus(Object[][] rows, Object[] col){
     JTable abakus = new JTable(rows,col);

     abakus.setBackground(Color.GREEN);
     abakus.setGridColor(Color.CYAN);
  
     c = build_c(0,8,1,3,100,100);
     c.fill = GridBagConstraints.NONE;
     L.setConstraints(abakus, c);
     add(abakus);
    
     pack();
 }

 
    

}

Gibt es eine Möglichkeit das zu vermeiden?

MFG enrix
 
Moin,

Klickt man nun auf dem Button so übergibt der Button ein actionevent zum FormListener (hier nicht dargestellt) dort wird mit einer geeigneten Methode das Ausgangsformular durch ein JTable ergänzt. Wie gesagt, leider so, dass die Formularform sich verändert.
Wenn sich die Form oder Größe Deines Formulars nun wirklich erst durch das Hinzufügen des Tables ändern, dann solltest vlt. doch lieber genau diese Methode mal posten - und nicht einfach weglassen ..... ;-]

Gruß
Klaus
 
Versuchs mal ohne pack. Das sorgt ja dafür dass die Größe neu berechnet wird und alle Komponenten so ausgelegt werden dass sie möglichst wenig Platz beanspruchen.

Durch das GridBagLayout solltest du kein pack benötigen.
 
Habe es mal ohne pack(); probiert aber das klappt leider auch nicht. dann wird meine JTable-Komponente gar nicht erst angezeigt. Es ist so, dass ich einen Abakus darstellen möchte und die Zeilen des JTable's ergeben sich aus der Eingabe des Benutzers. das JTable hat also immer ne andere Höhe.

Hier ist der FormListener, welcher auf das Ereignis des Buttoons reagiert

Code:
    public void actionPerformed(ActionEvent e) {
       if (e.getActionCommand().equals("Einlesen")){
              float t,dez;
               
              String Eingabe =  Form1.Edit1.getText();
              abakus c = new abakus();
              Form1.cleanAbakus();
              c.clear();
              
              //Hier wird die Zeilenanzahl des JTables festgelegt
              c.setAbakusRows(Eingabe);
              c.setAbakus(Eingabe);
             
              //Hier werden die Daten des Abakuses an das Formular übergeben 
              //Welches daraus ein JTable baut
              Form1.setAbakus(c.getContent(),c.getAbakusColumn(),4);
              c.setScale();
              c.setCent();
              Form1.Edit2.setText(c.getCent());

              

       }
 
Zurück