ProgRAMmer
ProgRAMmer

Reputation: 31

How to make JPanel fill the entire JFrame?

I am making an UI in a minecraft plugin. Everything is working, except I have a JPanel and it doesn't fill the whole JFrame. So what I want is the JPanel fill the entire JFrame even if we re-scale the window.

So, how can I do this?

My plugin creates a button for every player and when I click the button it kicks the player.

My code (I can't really post less because I don't know where I need to change something):

public static JFrame f;
public static JTextField jtf;
public static JPanel jp;

public static void creategui()
{

    System.out.println("GUI created.");
    f = new JFrame("Players");
    jp = new JPanel();
    jp.setLayout(new FlowLayout(FlowLayout.LEFT));
    jp.setBackground(Color.GRAY);
    jtf = new JTextField("Reason");
    jtf.setPreferredSize(new Dimension(200,20));
    jtf.setToolTipText("Write the reason here.");
    jp.setSize(new Dimension(200,200));
    f.setLayout(null);
    f.setSize(500,500);
    f.setVisible(true);
    jp.add(jtf);f.add(jp, BorderLayout.CENTER);
    for (final Player p : Bukkit.getOnlinePlayers())
    {
        System.out.println("Looping.");
        final JButton b = new JButton();
        b.setName(p.getName());
        b.setText(p.getName());
        b.setToolTipText("Kick " + b.getText());
        b.setBackground(Color.GREEN);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!b.getBackground().equals(Color.RED))
                {
                    Bukkit.getScheduler().runTask(main, new Runnable() {
                        public void run() {
                            Bukkit.getPlayer(b.getText()).kickPlayer(jtf.getText());
                            b.setBackground(Color.RED);
                        }
                    });
                }

            }
        });
        jp.add(b);
        System.out.println("Button added.");
    }
    f.add(jp, BorderLayout.CENTER);

}

Upvotes: 0

Views: 1370

Answers (4)

itzjackyscode
itzjackyscode

Reputation: 1084

A 1x1 grid layout does the job quite nicely.

window = new JFrame();
panel = new JPanel();
window.setLayout(new java.awt.GridLayout(1, 1));
window.add(panel);

Upvotes: 1

c0der
c0der

Reputation: 18792

The question should include an mcve reproducing the problem so we can test it.
It could look like this :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Mcve {

    private static List<String> players = Arrays.asList(new String[]{"Player A", "Player B"});

    public static void main(String[] args) {
        creategui();
    }

    public static void creategui()
    {

        JPanel jp = new JPanel();
        jp.setBackground(Color.GRAY);
        JTextField jtf = new JTextField("Reason");
        jtf.setPreferredSize(new Dimension(200,20));
        jtf.setToolTipText("Write the reason here.");
        jp.setSize(new Dimension(200,200));
        jp.add(jtf);

        for (final String p : players)
        {
            final JButton b = new JButton();
            b.setText(p);
            b.setBackground(Color.GREEN);
            b.addActionListener(e -> {
                if (!b.getBackground().equals(Color.RED))
                {
                  b.setBackground(Color.RED);
                }
            });
            jp.add(b);
        }

        JFrame f = new JFrame("Players");
        f.setLayout(null);
        f.setSize(500,500);
        f.add(jp, BorderLayout.CENTER);
        f.setVisible(true);
    }
}

To make the JPanel fill the entire frame simply remove this line :

f.setLayout(null);

and let the default BorderLayout manager do its work.

Here is a modified version with some additional comments:

public class Mcve {

    private static List<String> players = Arrays.asList(new String[]{"Player A", "Player B"});

    public static void main(String[] args) {
        creategui();
    }

    public static void creategui()
    {

        JPanel jp = new JPanel();
        jp.setBackground(Color.GRAY);
        JTextField jtf = new JTextField("Reason");
        jtf.setPreferredSize(new Dimension(200,20));
        jtf.setToolTipText("Write the reason here.");
        jp.setPreferredSize(new Dimension(250,200)); // set preferred size rather than size 
        jp.add(jtf);

        for (final String p : players)
        {
            final JButton b = new JButton();
            b.setText(p);
            b.setBackground(Color.GREEN);
            b.addActionListener(e -> {
                if (!b.getBackground().equals(Color.RED))
                {
                  b.setBackground(Color.RED);
                }
            });
            jp.add(b);
        }

        JFrame f = new JFrame("Players");
        //f.setLayout(null);  null layouts are bad practice 
        //f.setSize(500,500); let layout managers set the sizes 
        f.add(jp, BorderLayout.CENTER);
        f.pack();
        f.setVisible(true);
    }
}

Upvotes: 2

ProgRAMmer
ProgRAMmer

Reputation: 31

So I fixed it somehow, this is the code:

public static void creategui()
{

    System.out.println("GUI created.");
    f = new JFrame("Players");
    jp = new JPanel();
    jp.setBackground(Color.GRAY);
    jp.setSize(200,200);
    jtf = new JTextField(30);
    jtf.setToolTipText("Write the reason here.");

    jp.add(jtf);
    for (final Player p : Bukkit.getOnlinePlayers())
    {
        System.out.println("Looping.");
        final JButton b = new JButton();
        b.setName(p.getName());
        b.setText(p.getName());
        b.setToolTipText("Kick " + b.getText());
        b.setBackground(Color.GREEN);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!b.getBackground().equals(Color.RED))
                {
                    Bukkit.getScheduler().runTask(main, new Runnable() {
                        public void run() {
                            getplr(b.getText()).kickPlayer(jtf.getText());
                            b.setBackground(Color.RED);
                        }
                    });
                }

            }
        });
        jp.add(b);
        System.out.println("Button added.");
    }

    f.setLayout(new BorderLayout());
    f.add(jp, BorderLayout.CENTER);
    f.setSize(500,500);
    f.pack();
    f.setVisible(true);

}

Upvotes: 0

Abra
Abra

Reputation: 20914

Either set the layout manager for jp (the JPanel in the code you posted) to BorderLayout and add jtf (the JTextField in the code you posted) to the CENTER of jp, as in:

f = new JFrame();
jp = new JPanel(new BorderLayout());
jtf = new JTextField(30); // number of columns
jp.add(jtf, BorderLayout.CENTER);
f.add(jp, BorderLayout.CENTER);

or dispense with jp and add jtf directly to f (the JFrame in the code you posted), as in:

f = new JFrame();
jtf = new JTextField(30);
f.add(jtf, BorderLayout.CENTER);

The key is that the CENTER component of BorderLayout expands to fill the available space.

Upvotes: 0

Related Questions