简体   繁体   中英

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.

  • I use Layout manager ( FlowLayout ) for the JPanel .
  • I tried using a Layout manager for the JFrame , well it didn't solved my problem because it didn't resize the JPanel .. I tried setting the size of the JPanel to the JFrame 's size, but when it's resized it doesn't scale with it.

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

}

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

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.

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

}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM