【问题标题】:Adding JButtons in for loop在 for 循环中添加 JButton
【发布时间】:2020-07-09 00:02:55
【问题描述】:

JAVA 摆动问题

我想根据代表按钮文本的字符串列表创建一个 JButton 列表。 在我的第一步中,我从外部文本文件中收集按钮文本的数据。此数据存储在 data 变量中。

List<String> data = ReadFile("texts.txt")

现在我想创建 JButtons 列表,命名按钮。我在那里设置了他们的文本和他们的边界。边界是相对于索引的,因此按钮被放置在彼此下方。最后,我将按钮添加到框架和按钮列表中。

List<JButton> buttons = new ArrayList<>();
for (int index = 0; index < data.size(); index++) {
    JButton button = new JButton();
    button.setText(data.get(index));
    button.setBounds(0, index*50, 100, 50);
    add(button);
    buttons.add(button);

但是当我执行这个时,最后一个按钮结束了,当我不将鼠标悬停在它们上面时,第一个按钮也会消失,但这是基于最后一个按钮放在上面的事实:

Picture of the executed script

最后一个按钮有框架的大小,没关系,如果我调整框架的大小:

Picture of the resized screen

我希望有人可以帮助我或告诉我在哪里可以找到帮助。谢谢。

【问题讨论】:

标签: java swing loops jbutton bounds


【解决方案1】:

最后一个 Button 结尾很大,当我不将鼠标悬停在它们上面时,第一个按钮也会消失,

这是因为默认情况下 JFrame 的内容窗格使用BorderLayout。当您将组件添加到BorderLayout 时,按钮将添加到CENTER。但是,CENTER 只能添加单个组件,因此只有最后添加的组件的大小/位置由 BorderLayout 管理。

不要尝试手动设置组件的大小/位置。这是布局管理器的工作。在您的情况下,您可以使用几个具有不同布局的面板,因此将您的按钮对齐在左侧的一列中。比如:

JPanel buttonPanel = new JPanel( new GridLayout(0, 1) );

for (int index = 0; index < data.size(); index++) {
    JButton button = new JButton();
    button.setText(data.get(index));
    button.setBounds(0, index*50, 100, 50);
    //add(button);
    buttonPanel.add( button );
    buttons.add(button);
}

add(buttonPanel, BorderLayout.LINE_START);

试试上面的代码,你会发现按钮的大小都是一样的,但是大小会随着框架高度的变化而不断变化。

因此,为了防止这种调整大小,我们需要使用额外的布局管理器让按钮显示在其首选高度:

//add(buttonPanel, BorderLayout.LINE_START);
JPanel wrapper = new JPanel( new BorderLayout() );
wrapper.add(buttonPanel, BorderLayout.PAGE_START);
add(wrapper, BorderLayout.LINE_START);

阅读Layout Manager 上的 Swing 教程以获取更多信息和示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2015-07-11
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多