簡體   English   中英

固定寬度,JPanel中可變高度與流量

[英]Fixed width, variable height in JPanel with flow

我對Java的布局管理器有一個惱人的問題。 我有以下情況:在面板A中是另外兩個具有絕對布局的面板B和具有FlowLayout的C. B是高度自定義的,並通過setPreferredSize設置固定大小。 C應具有與B相同的固定寬度,否則具有可變高度,具體取決於流中添加的組件數量。 結果A應該具有固定的寬度和A.height + B.height作為高度 - 至少這是我想要的。

然而,我得到的是面板A的寬度根本不固定(即使我設置了它的首選尺寸),面板C中的內容不是自動換行,而是以長行顯示。 當然,這也使得B具有比它應該更大的寬度。

我該怎么做才能解決這個問題? 有沒有更好的布局,還是我必須模仿所有使用絕對布局?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Test extends JPanel
{
    public Test ()
    {
        this.setLayout( new BoxLayout( this, BoxLayout.Y_AXIS ) );

        JPanel top = new JPanel( null );
        top.setBackground( Color.GREEN );
        top.setPreferredSize( new Dimension( 200, 20 ) );
        JPanel flowPanel = new JPanel( new FlowLayout( FlowLayout.LEFT, 2, 2 ) );

        this.add( top );
        this.add( flowPanel );

        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
    }
}

換行布局應該有所幫助。

您放入BorderLayout的LINE_END或LINE_START部分的所有內容都將保持其寬度不變:如果容器調整大小,則只調整高度

NORTH和SOUTH是寬度可變的

CENTER是寬度和高度可變的

LINE_START和LINE_END只是高度變量

所以,我建議你把'C'容器放在這種BorderLayout區域

提供所需的高級視圖配置的最佳方法是通過功能強大的GridBagLayoutManager替換FlowLayout 值得注意的是,當使用流暢的子類(如GBC)時,通常由GridBagConstraints表示的約束更容易理解。

最后,像往常一樣,你應該考慮看一下Swing教程

  1. 您不應該直接將子項添加到框架中。 始終添加到contentPane - > this.getContentPage().add(...)

  2. 要使布局正常工作,請在內容頁面中放置帶有GridBagLayout的JPanel,並使該面板填充內容頁面。

  3. 給GridBagLayout 2列。

現在您無法禁用窗口的水平調整大小,因此您必須找到另一種方法來處理額外的空間。 我建議給第一列固定寬度(設置fill=NONE ),讓面板C填充剩余空間。

如果將面板B所有尺寸(最小值,最大值,首選尺寸)設置為首選尺寸,則不應再更改尺寸。

提示:如果Swing布局不起作用,請將其嵌套在另一個布局中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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