java - 如何在 for 循环中添加 JButton?
问题描述
所以我在我的世界插件中制作了一个用户界面,它为每个玩家添加了一个按钮,当我们点击按钮时,它会踢玩家。这是 for 循环:
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);
}
});
}
}
});
System.out.println("Button added.");
f.add(b);
}
假设服务器中有 2 个玩家,asd和dsa。当这个 for 循环运行时,它只是为asd添加按钮,但打印Button added(和Looping)两次。
(f是一个公共静态 JFrame,而jtf是一个公共静态 JTextField)
那么......为什么它不起作用?
解决方案
之所以会发生这种情况,是因为 defultLayoutManager
是BorderLayout
,所以该方法add(JComponent comp)
将 置于JComponent
的中心JFrame
,而 则JComponent
填充了整个JFrame
。使用 方法f.setLayout(new GridLayout(number_of_players, 1));
,它会将 to 行拆分JFrmae
为您的玩家数量,因此JComponents
可以显示乘数。
推荐阅读
- java - 如何停止在 Firestore 中获取数据?
- azure - New-AzureRmEventGridSubscription 报告成功,但 Get-AzureRmEventGridSubscription 失败
- javascript - JS函数以相反的顺序组成
- hibernate - 通过 HQL (Hibernate) 选择枚举集合类型的实体属性
- android - 在 javaRx 2.0 中创建事件总线
- html - CSS 倾斜和变换在 Chrome 和 Edge 上添加了不需要的轮廓
- date - woocommerce中的自定义日期字段只有几年?
- pandas - Pandas 逐行求和
- vba - .txt 用于分隔工作表
- mysql - 从另一个表插入表,但如果已经存在则更新