Как заставить JPanel заполнить весь JFrame? - PullRequest
0 голосов
/ 21 июня 2019

Я делаю пользовательский интерфейс в minecraft плагине. Все работает, за исключением того, что у меня есть JPanel, и он не заполняет все JFrame. Поэтому я хочу, чтобы JPanel заполнило все JFrame, даже если мы изменим масштаб окна.

  • Я использую менеджер раскладок (FlowLayout) для JPanel.
  • Я попытался использовать менеджер компоновки для JFrame, ну, это не решило мою проблему, потому что не изменило размер JPanel .. Я попытался установить размер JPanel на JFrame размер, но при изменении размера он не масштабируется вместе с ним.

Итак, как я могу это сделать?

Мой плагин создает кнопку для каждого игрока, и когда я нажимаю кнопку, он пинает игрока.

Мой код (я не могу опубликовать меньше, потому что я не знаю, где мне нужно что-то изменить):

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

}

Ответы [ 4 ]

2 голосов
/ 22 июня 2019

Вопрос должен включать mcve , воспроизводящий проблему, чтобы мы могли ее протестировать.Это может выглядеть так:

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

Чтобы заполнить JPanel весь кадр просто удалить эту строку:

f.setLayout(null);

и оставить значение по умолчанию BorderLayout менеджер делает свою работу.

Вот модифицированная версия с некоторыми дополнительными комментариями:

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);
    }
}
0 голосов
/ 25 июня 2019

Схема сетки 1x1 отлично справляется с работой.

window = new JFrame();
panel = new JPanel();
window.setLayout(new java.awt.GridLayout(1, 1));
window.add(panel);
0 голосов
/ 21 июня 2019

Так что я как-то исправил, вот код:

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

}
0 голосов
/ 21 июня 2019

Либо установите менеджер макета для jp (JPanel в опубликованном вами коде) на BorderLayout и добавьте jtf (JTextField в опубликованном вами коде) в ЦЕНТР jp , как в:

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

или откажитесь от jp и добавьте jtf непосредственно к f (JFrame в коде, который вы разместили), как в:

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

Ключ в том, что компонент CENTER BorderLayout расширяется, чтобы заполнить доступное пространство.

...