![](/img/trans.png)
[英]GridBagLayout and FlowLayout: Components appearing at unexpected positions
[英]Unexpected behavior of FlowLayout
我正在使用帶有默認FlowLayout
布局管理器的JPanel
。 我認為如果應用程序 window 被調整大小並且沒有足夠的寬度在一行中顯示JPanel
中的所有組件,一些組件將被移動到另一行。
此假設基於文檔:
如果容器中的水平空間太小,無法將所有組件放在一行中,則 FlowLayout class 使用多行。
https://docs.oracle.com/javase/tutorial/uiswing/layout/flow.html
它在某些情況下有效。 例如,在使用此代碼並減小 window 寬度時,按鈕將位於不同的行:
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
的建議。 這似乎是合理的,但我仍然不清楚為什么在上面的示例中我的行為不一致。
frame.getContentPane().add(BorderLayout.CENTER, panel);
首先,該方法自 JDK1.1 以來已“過時”。
從那時起,首選方法是添加“約束”作為第二個參數:
frame.getContentPane().add(panel, BorderLayout.CENTER);
但是將一個 JPanel 放入另一個 JPanel 並且布局管理器停止按預期運行就足夠了:
代碼按預期工作。 問題是你的期望。
更改第一個示例中的代碼:
//frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.getContentPane().add(panel, BorderLayout.PAGE_START);
現在,當您減小寬度時,組件就會消失。 這是因為BorderLayout.PAGE_START
將尊重所添加組件的首選高度。 首選高度是通過在單行上顯示所有組件來確定的。
但是將一個 JPanel 放入另一個 JPanel 並且布局管理器停止按預期運行就足夠了
當您開始包裝面板時,您需要了解其中的含義。
FlowLayout
尊重添加的所有組件的首選大小。 所以內部面板中的組件都按預期顯示在一行中。
當您將外面板添加到BorderLayout.CENTER
時,會調整外面板的大小,但不會影響內面板,因為FlowLayout
的規則,比如添加的任何組件都會顯示在面板的頂部。 由於內面板是單個組件,因此無需包裝。
這是一個經常用於確保組件保持其首選大小的技巧。
另一個例子。 也許您在要添加到BorderLayout.PAGE_START
的面板上有一個水平GridLayout
按鈕。
如果您直接添加面板,則按鈕的大小將隨着框架的更改而縮小/增長。
如果您希望按鈕大小保持不變,您可以使用“包裝”面板。 然后“包裝”面板大小縮小/增長,但按鈕大小保持不變。
您需要了解布局管理器的規則,以便有效地使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.