user2022185
user2022185

Reputation: 127

Why is extra space being added to the frame?

So I'm adding this code to a JFrame which has other layout managers and components in them.

    private JPanel testing123() {
    JPanel j = new JPanel(new FlowLayout());
    jbtOk = new JButton("OK");
    jbtOk.setMnemonic('K');
    jbtExit = new JButton("Exit");
    jbtExit.setMnemonic('x');

    add(jbtOk);
    add(jbtExit);
    j.add(jbtOk);
    j.add(jbtExit);
    return j;
}

Without this code, the JFrame looks fine, but when I add it, it adds a large amount of empty space under these two buttons. Why is this happening?

enter image description here

This replicates it:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Test extends JFrame implements ActionListener, KeyListener {

JButton jbtOk, jbtExit;

JPanel p = new JPanel(new GridLayout(0,1));
JPanel gui = new JPanel(new BorderLayout(2,2));

public Test() {

    super("t");
    //setSize(300,300);
    setVisible(true);
    JPanel test = test();
    JPanel testing = testing();
    JPanel testing123 = testing123();
    p.add(test);
    p.add(testing);
    p.add(testing123);
    this.getContentPane().add(p);
    pack();
}

private JPanel test() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel labelFields = new JPanel(new BorderLayout(2,2));
    labelFields.setBorder(new TitledBorder("m"));
    p.add(gui);
    p.add(labelFields);
    JPanel labels = new JPanel(new GridLayout(0,1,1,1));
    labels.setBorder(new TitledBorder("a"));
    JPanel fields = new JPanel(new GridLayout(0,1,1,1));
    fields.setBorder(new TitledBorder("b"));

    p.add(labels);
    p.add(fields);
    add(fields);
    add(p);
    return gui;
}

private JPanel testing() {
    JPanel guiCenter = new JPanel(new FlowLayout(FlowLayout.CENTER));
    guiCenter.setBorder(new TitledBorder("n"));
    guiCenter.add(new JScrollPane(new JTextArea(5,30)));
    gui.add(guiCenter, BorderLayout.CENTER);
    return guiCenter;
}

private JPanel testing123() {
    JPanel j = new JPanel(new FlowLayout());
    jbtOk = new JButton("OK");
    jbtOk.setMnemonic('K');
    jbtExit = new JButton("Exit");
    jbtExit.setMnemonic('x');

    //add(jbtOk);
    //add(jbtExit);
    j.add(jbtOk);
    j.add(jbtExit);
    return j;
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}
}

Upvotes: 2

Views: 572

Answers (1)

Paul Samsotha
Paul Samsotha

Reputation: 209072

"I want to get rid of the extra space under the OK and Exit buttons."

The problem is you are using the GridLayout that will make all the JPanel equal size. What you should do instead is wrap the first four JPanel in GridLayout, then keep the default BorderLayout of the JFrame, add the JPanel to BorderLayout.CENTER of the JFrame and add the buttons JPanel to the BorderLayout.PAGE_END. This should solve the problem

public Test() {

    super("t");
    setDefaultCloseOperation(EXIT_ON_CLOSE);     
    JPanel test = test();
    JPanel testing = testing();
    JPanel testing123 = testing123();
    p.add(test);
    p.add(testing);
    add(p, BorderLayout.CENTER);             <---
    add(testing123, BorderLayout.PAGE_END);  <---
    pack();
    setVisible(true);
}

enter image description here

Complete running code

import java.awt.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class Test extends JFrame {

    JButton jbtOk, jbtExit;

    JPanel p = new JPanel(new GridLayout(0, 1));
    JPanel gui = new JPanel(new BorderLayout(2, 2));

    public Test() {

        super("t");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel test = test();
        JPanel testing = testing();
        JPanel testing123 = testing123();
        p.add(test);
        p.add(testing);
        add(p, BorderLayout.CENTER);
        add(testing123, BorderLayout.PAGE_END);
        pack();
        setVisible(true);
    }

    private JPanel test() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel labelFields = new JPanel(new BorderLayout(2, 2));
        labelFields.setBorder(new TitledBorder("m"));
        p.add(gui);
        p.add(labelFields);
        JPanel labels = new JPanel(new GridLayout(0, 1, 1, 1));
        labels.setBorder(new TitledBorder("a"));
        JPanel fields = new JPanel(new GridLayout(0, 1, 1, 1));
        fields.setBorder(new TitledBorder("b"));

        p.add(labels);
        p.add(fields);
        return gui;
    }

    private JPanel testing() {
        JPanel guiCenter = new JPanel(new FlowLayout(FlowLayout.CENTER));
        guiCenter.setBorder(new TitledBorder("n"));
        guiCenter.add(new JScrollPane(new JTextArea(5, 30)));
        gui.add(guiCenter, BorderLayout.CENTER);
        return guiCenter;
    }

    private JPanel testing123() {
        JPanel j = new JPanel(new FlowLayout());
        jbtOk = new JButton("OK");
        jbtOk.setMnemonic('K');
        jbtExit = new JButton("Exit");
        jbtExit.setMnemonic('x');

        j.add(jbtOk);
        j.add(jbtExit);

        return j;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Test();
            }
        });
    }
}

Upvotes: 1

Related Questions