【发布时间】:2020-10-04 17:15:33
【问题描述】:
我正在使用 JPanel 和默认的 FlowLayout 布局管理器。我认为如果应用程序窗口被调整大小并且没有足够的宽度在一行中显示JPanel 中的所有组件,一些组件将被移动到另一行。
此假设基于文档:
如果容器中的水平空间太小,无法将所有组件放在一行中,FlowLayout 类会使用多行。
https://docs.oracle.com/javase/tutorial/uiswing/layout/flow.html
它在某些情况下有效。例如,在使用此代码并减小窗口宽度时,按钮将位于不同的行:
import javax.swing.*;
import java.awt.*;
public class FlowLayoutExpected {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JButton button3 = new JButton("Button 3");
panel.add(button1);
panel.add(button2);
panel.add(button3);
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.setSize(350, 70);
frame.setVisible(true);
}
}
在减小宽度之前 -> 减小宽度后
但是将一个JPanel 放入另一个JPanel 就足够了,布局管理器就会停止按预期运行:
import javax.swing.*;
import java.awt.*;
public class FlowLayoutReal {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel outerPanel = new JPanel();
JPanel innerPanel = new JPanel();
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JButton button3 = new JButton("Button 3");
innerPanel.add(button1);
innerPanel.add(button2);
innerPanel.add(button3);
outerPanel.add(innerPanel);
frame.getContentPane().add(BorderLayout.CENTER, outerPanel);
frame.setSize(350, 70);
frame.setVisible(true);
}
}
在减小宽度之前 -> 减小宽度后
我试图澄清我误解了什么。
我已经阅读了很多使用 WrapLayout 而不是 FlowLayout 的建议。这似乎是合理的,但我仍然不清楚为什么我在上面的示例中会出现不一致的行为。
【问题讨论】:
-
见stackoverflow.com/questions/52234113/… ...重点是:你的期望是有缺陷的。你不能指望像那样“简单地”在面板内推动面板。所有这些布局管理器都有一定的“属性”和用例,“流内流”不一定是受支持的用例。换句话说:如果您需要更复杂的 UI,那么您可以通过使用更复杂的布局管理器来实现,而不是将简单的布局管理器组合在一起。
-
@GhostCat,是的,我明白你的意思。我将使用其他布局管理器来处理复杂的 UI。我提供了一个简化的示例,我不会无缘无故地将 JPanel 放在 JPanel 上 :-) 同时,我在文档或其他地方找不到任何我不能这样做的语句。所以我的意图是了解我在文档中遗漏的内容,以避免将来出现此类问题(以及其他文档)。
-
“我在文档或其他地方找不到任何声明,为什么我不能这样做。”代码是最终的文档。请注意,您不能将 FlowLayout 放在开发人员笔记本中 BorderLayout 内的 FlowLayout 内,然后继续处理下一个问题。
-
@GilbertLeBlanc,“代码是终极文档。” - 简单但有用的提醒。谢谢。
标签: java swing awt layout-manager flowlayout