【发布时间】:2021-12-23 08:52:54
【问题描述】:
我有一个 JFrame,目前包含 4 个面板。其中一个面板是键盘,其他 3 个框架是键盘的控制面板,如下图所示:
我一直在尝试找到一种方法来使用 GridLayout 缩小控制面板的宽度,以便它们不会占用框架的整个宽度,但不幸的是我的代码无法正常工作。另外,我想将钢琴卷推到屏幕底部。到目前为止,这是我的代码:
JFrame frame = new JFrame();
JPanel container = new JPanel();
container.setSize(1000, 1000);
container.setLayout(new GridLayout(5,5));
// add control panels to JPanel
int y = 0;
for(int i =0; i < oscillators.length; ++i) {
JPanel panel = new JPanel();
panel.setSize(289, 100);
panel.setBorder(Utils.WindowDesign.LINE_BORDER);
panel.setLayout(null);
container.add(oscillators[i]);
y+=105;
}
// add keyboard to panel
keyboard = new PianoKeys(this);
keyboard.setFocusable(true);
container.add(keyboard);
// make frame visible
frame.setSize(1000, 1000);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setBackground(Color.WHITE);
frame.setLayout(new BorderLayout());
frame.add(container);
frame.setVisible(true);
有人可以向我解释为什么这不能按预期工作吗?我将控制面板的宽度设置为 289,并且我的网格包含 5 列和 5 行,所以我不确定为什么控制面板最终会扩展到整个宽度。感谢您提供的任何帮助!
【问题讨论】:
-
1) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果给定更大的宽度和高度。 2) Edit 添加一个 minimal reproducible example 以表示您对 GUI 进行布局的最佳尝试。
-
一般提示:1) 不要使用
null布局。 2) 避免调用setXXXSize方法(其中XXX可能代表各种事物,如无或Minimum或Preferred)。布局管理器仅将它们作为建议,但更重要的是,GUI 中的组件和容器通常能够更好地自行确定这些尺寸。然后,当所有组件和容器都添加完毕后.. 3) 将frame.setSize(1000, 1000);替换为frame.pack();- 以获得正确的 GUI 大小。 -
差点忘了:
GridLayout通常不用作主 GUI 的主布局。我怀疑它的使用是这种情况下问题的核心,但在知道预期的布局之前无法推测更多。
标签: java swing jframe jpanel awt