gpt4 book ai didi

java - 如何让JPanel填满整个JFrame?

转载 作者:行者123 更新时间:2023-12-02 01:27:23 25 4
gpt4 key购买 nike

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

  • 我对 JPanel 使用布局管理器 (FlowLayout)。
  • 我尝试使用 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);

}

最佳答案

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

关于java - 如何让JPanel填满整个JFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com