簡體   English   中英

FlowLayout 的意外行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM