我正在使用minecraft
插件制作UI。一切正常,除了我有一个JPanel
并且它没有填满整个JFrame
。所以我想要的是JPanel
填充整个JFrame
,即使我们重新缩放窗口也是如此。
FlowLayout
使用了布局管理器(JPanel
)。JFrame
使用布局管理器,但是它没有解决我的问题,因为它没有调整JPanel
的大小。.我尝试设置{{1}的大小}更改为JPanel
的大小,但是调整大小时并不会随之缩放。那我该怎么办?
我的插件会为每个玩家创建一个按钮,当我单击该按钮时,它将踢玩家。
我的代码(我不能真正减少张贴,因为我不知道我需要在哪里更改某些东西):
JFrame
答案 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
,然后在代码中添加jtf
(JTextField
您发布的信息)到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);