佈局就是各個組件在窗口中的位置,或爲相對位置或爲絕對位置。在界面編程中是必要的。
1、簡介
把 Swing
的各種組件(JComponent
)添加到面板容器中(JPanel
),需要給面板容器指定佈局管理器(LayoutManager
),明確容器(Container
)內的各個組件之間的排列布局方式。
2、箱式佈局
由BoxLayout類實現的佈局管理器稱爲箱式佈局管理器,用來管理一組水平或垂直排列的組件,如果是用來管理一組水平排列的組件,則稱爲水平箱,效果如左圖所示,如果是用來管理一組垂直排列的組件,則稱爲垂直箱,效果如右圖所示
Swing 提供了一個實現了 BoxLayout 的容器組件Box
。使用 Box 提供的靜態方法,可快速創建水平/垂直箱容器(Box),以及填充組件之間空隙的不可見組件。
// 創建一個水平箱容器
Box hBox = Box.createHorizontalBox();
// 創建一個垂直箱容器
Box vBox = Box.createVerticalBox();
Box 內的組件之間默認沒有空隙並居中,如果想在組件之間(或頭部/尾部)添加空隙,可以在其中添加一個影響佈局的不可見組件。
topicBox.add(Box.createHorizontalStrut(5));// 添加一個5像素寬的水平支柱
box.add(Box.createVerticalStrut(5));// 添加一個5像素高的垂直支柱
contentBox.setAlignmentX(1);// 設置組件的水平調整值,靠右側對齊
contentLabel.setAlignmentY(0);// 設置組件的垂直調整值,靠上方對齊
例如將一根按鈕添加到箱式容器裏面:
JButton submitButton = new JButton("確定");// 創建一個按鈕
submitButton.setAlignmentX(1);// 設置組件的水平調整值,靠右側對齊
box.add(submitButton);// 添加到垂直箱容器中
3、卡片佈局管理器
由CardLayout類實現的佈局管理器稱爲卡片佈局管理器,用來操縱其所管理容器中包含的容器或組件。每個直接添加到其所管理容器中的容器或組件爲一個卡片,最先被添加到其所管理容器中的容器或組件被認爲是第一個卡片,最後被添加的則爲最後一個卡片,初次運行時將顯示第一個卡片。
創建一個卡片佈局管理器:
cardLayout = new CardLayout();// 創建一個卡片佈局管理器對象
cardPanel = new JPanel(cardLayout);// 創建一個採用片佈局管理器的面板對象
getContentPane().add(cardPanel, BorderLayout.CENTER);// 添加到窗體中間
卡片中添加組件
JButton btn01 = new JButton("Button01");
panel.add(btn01, "btn01"); //btn01爲一個組件,"btn01"爲卡片的名字
常用的方法:
// 顯示第一張卡片 void first(Container parent);
// 顯示最後一張卡片 void last(Container parent);
// 顯示下一張卡片(自動循環顯示) void next(Container parent);
// 顯示上一張卡片(自動循環顯示) void previous(Container parent);
// 顯示指定名稱的組件(添加組件到容器時,可同時添加組件的名稱) void show(Container parent, String name);
4、網格組佈局管理器
由GridBagLayout類實現的佈局管理器稱爲網格組佈局管理器,它實現了一個動態的矩形網格,這個矩形網格由無數個矩形單元格組成,每個組件可以佔用一個或多個這樣的單元格。所謂動態的矩形網格,就是可以根據實際需要隨意增減矩形網格的行數和列數。
設置爲網格佈局
getContentPane().setLayout(new GridBagLayout());
添加一個組件到一個網格里面,這裏例如一個按鈕
final JButton button = new JButton("A");
final GridBagConstraints gridBagConstraints = new GridBagConstraints(); //佈局管理器
gridBagConstraints.gridy = 0;// 起始點爲第1行
gridBagConstraints.gridx = 0;// 起始點爲第1列
gridBagConstraints.weightx = 10;// 第一列的分佈方式爲10%
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;//組件 在其 顯示區域內 的填充方式
getContentPane().add(button, gridBagConstraints);
5、彈簧佈局管理器
彈簧佈局管理器以容器和組件的邊緣爲操縱對象,通過爲組件和容器邊緣以及組件和組件邊緣建立約束,實現對組件佈局的管理,如下圖所示
// 創建彈簧佈局管理器對象
SpringLayout springLayout = new SpringLayout();
Container contentPane = getContentPane();// 獲得窗體容器對象
// 將窗體容器修改爲採用彈簧佈局管理器
contentPane.setLayout(springLayout);
設置彈簧的距離
JLabel topicLabel = new JLabel("主題:");
contentPane.add(topicLabel);
// 主題標籤北側——>容器北側
springLayout.putConstraint(NORTH, topicLabel, 15, NORTH, contentPane);
// 主題標籤西側——>容器西側
springLayout.putConstraint(WEST, topicLabel, 5, WEST, contentPane);
支柱和彈簧:
Spring vST = Spring.constant(20);// 創建一個支柱
Spring hSP = Spring.constant(20, 100, 500);// 創建一個彈簧
JButton lButton = new JButton("按鈕L");
getContentPane().add(lButton);
springLayout.putConstraint(NORTH, lButton, vST, NORTH,getContentPane());// “按鈕L”北側——>容器北側
springLayout.putConstraint(WEST, lButton, hSP, WEST,getContentPane());// “按鈕L”西側——>容器西側
利用彈簧控制組件大小:
JButton lButton = new JButton("按鈕L");
getContentPane().add(lButton);
Spring widthSP = Spring.constant(60, 300, 600);// 創建一個彈簧
Spring heightST = Spring.constant(60);// 創建一個支柱
// 獲得“按鈕L”的Constraints對象
Constraints lButtonCons = springLayout.getConstraints(lButton);
lButtonCons.setWidth(widthSP);// 設置控制組件寬度的彈簧
lButtonCons.setHeight(heightST);// 設置控制組件高度的支柱