在循环中创建 JButton 只会导致最后一个出现 [重复]

Posted

技术标签:

【中文标题】在循环中创建 JButton 只会导致最后一个出现 [重复]【英文标题】:Creating JButtons in loop causes only last one to appear [duplicate] 【发布时间】:2016-04-05 17:56:41 【问题描述】:

我正在尝试使用扫描仪读取文件并为文件中的每个新行创建一个 JButton。创建按钮后,我将其添加到框架中。但是,一旦我运行该程序,只会出现最近的按钮。我不确定为什么在循环中创建按钮会导致这种情况发生。如果有人解释为什么会发生这种情况,将不胜感激,谢谢!

import java.awt.FlowLayout;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;

public class PointOfSale extends JFrame 

    ArrayList<JButton> menuButtons = new ArrayList<>();

    public PointOfSale(File menu) throws IOException
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());
        Scanner sc = new Scanner(menu);
        while (sc.hasNextLine())
            String name = sc.nextLine();
            JButton menuButton = new JButton(name);
            frame.add(menuButton);
            menuButtons.add(menuButton);
        
        sc.close();
        frame.pack();
        frame.setVisible(true);
    

【问题讨论】:

你确定只有一个按钮?检查他们的位置。 我只能看到一个按钮,是的。也许它们是重叠的? 如果您也在创建 JFrame,为什么还要扩展它?您实际上是在给每个人打电话frame.add(menuButton, BorderLayout.CENTER);。您需要将setLayout(new FlowLayout()); 更改为frame.setLayout(new FlowLayout()); 他们正在被覆盖。问题已结束。 我不认为这是正确的副本,因为他将布局设置为 FlowLayout,只是在错误的对象上。 【参考方案1】:

您的代码不尊重布局管理器,因为 JFrame 使用了只显示一个按钮的 BorderLayout。阅读布局管理器教程,使用不同的教程,这里可能是一个 GridLayout,你可能会解决你的问题。

【讨论】:

【参考方案2】:
//public class PointOfSale extends JFrame 
public class PointOfSale 

您的类不需要扩展 JFrame,因为您在类中创建了 JFrame。

那么你需要使用:

frame.setLayout(new FlowLayout());

因为这是您添加按钮的框架。

【讨论】:

以上是关于在循环中创建 JButton 只会导致最后一个出现 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JButton 位于不应该在其上的 JPanel [关闭]

在 foreach 循环中使用 file_put_contents 只会下载最后一项

如何从 JButton 中检索数据?

homework2:给出代码,回答问题

JButton 问题没有出现?

js的for循环中出现异步函数,回调引用的循环值始终是最后的值