首页 > 解决方案 > 如何在 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 个玩家,asddsa。当这个 for 循环运行时,它只是为asd添加按钮,但打印Button added(和Looping)两次。

f是一个公共静态 JFrame,而jtf是一个公共静态 JTextField

那么......为什么它不起作用?

标签: javaswingjbuttonminecraftbukkit

解决方案


之所以会发生这种情况,是因为 defultLayoutManagerBorderLayout,所以该方法add(JComponent comp)将 置于JComponent的中心JFrame,而 则JComponent填充了整个JFrame。使用 方法f.setLayout(new GridLayout(number_of_players, 1));,它会将 to 行拆分JFrmae为您的玩家数量,因此JComponents可以显示乘数。


推荐阅读