[英]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教程 。
您不應該直接將子項添加到框架中。 始終添加到contentPane
- > this.getContentPage().add(...)
要使布局正常工作,請在內容頁面中放置帶有GridBagLayout的JPanel,並使該面板填充內容頁面。
給GridBagLayout 2列。
現在您無法禁用窗口的水平調整大小,因此您必須找到另一種方法來處理額外的空間。 我建議給第一列固定寬度(設置fill=NONE
),讓面板C填充剩余空間。
如果將面板B
所有尺寸(最小值,最大值,首選尺寸)設置為首選尺寸,則不應再更改尺寸。
提示:如果Swing布局不起作用,請將其嵌套在另一個布局中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.