如何使JPanel填充整个JFrame?

时间:2019-06-21 08:02:15

标签: java swing jframe jpanel minecraft

我正在使用minecraft插件制作UI。一切正常,除了我有一个JPanel并且它没有填满整个JFrame。所以我想要的是JPanel填充整个JFrame,即使我们重新缩放窗口也是如此。

  • 我为FlowLayout使用了布局管理器(JPanel)。
  • 我尝试为JFrame使用布局管理器,但是它没有解决我的问题,因为它没有调整JPanel的大小。.我尝试设置{{1}的大小}更改为JPanel的大小,但是调整大小时并不会随之缩放。

那我该怎么办?

我的插件会为每个玩家创建一个按钮,当我单击该按钮时,它将踢玩家。

我的代码(我不能真正减少张贴,因为我不知道我需要在哪里更改某些东西):

JFrame

4 个答案:

答案 0 :(得分:2)

该问题应包含一个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);
    }
}

答案 1 :(得分:0)

jp(您发布的代码中的JPanel)的布局管理器设置为BorderLayout,然后在代码中添加jtfJTextField您发布的信息)到jp的CENTER,如下所示:

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

关键是BorderLayout的CENTER组件将展开以填充可用空间。

答案 2 :(得分:0)

所以我以某种方式修复了它,这是代码:

handleOpenUrl = function handleOpenURL(url) {
            const token = url.replace("smartpiggybank://intesaSuccess", "https://backdashboard.smartshopping.network");
            console.log("Token: " + token);
            FlowRouter.go('/outletLast');
        }

答案 3 :(得分:0)

1x1的网格布局可以很好地完成这项工作。

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