- Jython 教程
- Jython - 首頁
- Jython - 概述
- Jython - 安裝
- Jython - 匯入 Java 庫
- Jython - 變數和資料型別
- Jython - 使用 Java 集合型別
- Jython - 決策控制
- Jython - 迴圈
- Jython - 函式
- Jython - 模組
- Jython - 包
- Jython - Java 應用程式
- Jython - Eclipse 外掛
- Jython - Eclipse 中的專案
- Jython - NetBeans 外掛和專案
- Jython - Servlets
- Jython - JDBC
- Jython - 使用 Swing GUI 庫
- Jython - 佈局管理
- Jython - 事件處理
- Jython - 選單
- Jython - 對話方塊
- Jython 有用資源
- Jython - 快速指南
- Jython - 有用資源
- Jython - 討論
Jython - 佈局管理
Java 中的佈局管理器是那些管理控制元件在容器物件(如Frame、Dialog或Panel)中放置的類。即使解析度發生變化或框架本身的大小發生調整,佈局管理器也會維護控制元件在框架中的相對位置。
這些類實現了Layout 介面。以下佈局管理器在AWT 庫中定義:
- BorderLayout
- FlowLayout
- GridLayout
- CardLayout
- GridBagLayout
以下佈局管理器在Swing 庫中定義:
- BoxLayout
- GroupLayout
- ScrollPaneLayout
- SpringLayout
在以下示例中,我們將使用 AWT 佈局管理器以及 Swing 佈局管理器。
- 絕對佈局
- 流式佈局
- 網格佈局
- 邊界佈局
- 盒子佈局
- 組佈局
現在讓我們詳細討論每個佈局。
絕對佈局
在探索所有上述佈局管理器之前,我們必須檢視控制元件在容器中的絕對定位。我們必須將框架物件的佈局方法設定為“None”。
frame.setLayout(None)
然後透過呼叫setBounds()方法來放置控制元件。它接受四個引數 - x 座標、y 座標、寬度和高度。
例如 - 將按鈕物件放置在絕對位置並設定絕對大小。
btn = JButton("Add")
btn.setBounds(60,80,60,20)
類似地,可以透過正確分配位置和大小來放置所有控制元件。此佈局相對易於使用,但在視窗大小調整或在螢幕解析度更改時執行程式時,無法保持其外觀。
在以下 Jython 指令碼中,三個 Jlabel 物件分別用於顯示文字“phy”、“maths”和“Total”。在這三個前面放置了 JTextField 物件。一個 Button 物件放置在“Total”標籤上方。
首先,建立 JFrame 視窗,並將佈局設定為 none。
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)
然後根據它們的絕對位置和大小新增不同的控制元件。完整程式碼如下:
from javax.swing import JFrame, JLabel, JButton, JTextField
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)
lbl1 = JLabel("Phy")
lbl1.setBounds(60,20,40,20)
txt1 = JTextField(10)
txt1.setBounds(120,20,60,20)
lbl2 = JLabel("Maths")
lbl2.setBounds(60,50,40,20)
txt2 = JTextField(10)
txt2.setBounds(120, 50, 60,20)
btn = JButton("Add")
btn.setBounds(60,80,60,20)
lbl3 = JLabel("Total")
lbl3.setBounds(60,110,40,20)
txt3 = JTextField(10)
txt3.setBounds(120, 110, 60,20)
frame.add(lbl1)
frame.add(txt1)
frame.add(lbl2)
frame.add(txt2)
frame.add(btn)
frame.add(lbl3)
frame.add(txt3)
frame.setVisible(True)
上述程式碼的輸出如下。
Jython FlowLayout
FlowLayout 是容器類的預設佈局管理器。它從左到右,然後從上到下排列控制元件。
在以下示例中,將 Jlabel 物件、JTextField 物件和 JButton 物件使用 FlowLayout 管理器在 JFrame 中顯示。首先,讓我們從javax.swing包和java.awt包中匯入所需的類。
from javax.swing import JFrame, JLabel, JButton, JTextField from java.awt import FlowLayout
然後建立一個 JFrame 物件並設定其 Location 以及 size 屬性。
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(200,200)
Set the layout manager for the frame as FlowLayout.
frame.setLayout(FlowLayout())
現在宣告 JLabel、JTextfield 和 JButton 類的物件。
label = JLabel("Welcome to Jython Swing")
txt = JTextField(30)
btn = JButton("ok")
最後,透過呼叫 JFrame 類的add()方法在框架中新增這些控制元件。
frame.add(label) frame.add(txt) frame.add(btn)
要顯示框架,將其 visible 屬性設定為 true。完整的 Jython 指令碼及其輸出如下所示:
from javax.swing import JFrame, JLabel, JButton, JTextField
from java.awt import FlowLayout
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(200,200)
frame.setLayout(FlowLayout())
label = JLabel("Welcome to Jython Swing")
txt = JTextField(30)
btn = JButton("ok")
frame.add(label)
frame.add(txt)
frame.add(btn)
frame.setVisible(True)
Jython GridLayout
GridLayout 管理器允許將控制元件放置在矩形網格中。每個網格單元格中放置一個控制元件。
在以下示例中,GridLayout 應用於 JFrame 物件,將其劃分為 4 行 4 列。每個網格單元格中都放置一個 JButton 物件。
讓我們首先匯入所需的庫:
from javax.swing import JFrame, JButton from java.awt import GridLayout
然後建立 JFrame 容器:
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,400)
現在,透過指定其維度為 4x4 來應用 GridLayout。
frame.setLayout(GridLayout(4,4))
我們現在應該使用兩個 FOR 迴圈,每個迴圈從 1 到 4,因此十六個 JButton 物件將放置在後續單元格中。
k = 0
frame.setLayout(GridLayout(4,4))
for i in range(1,5):
for j in range(1,5):
k = k+1
frame.add(JButton(str(k)))
最後將框架的可見性設定為 true。完整的 Jython 程式碼如下所示。
from javax.swing import JFrame, JButton
from java.awt import GridLayout
frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,400)
frame.setLayout(GridLayout(4,4))
k = 0
for i in range(1,5):
for j in range(1,5):
k = k+1
frame.add(JButton(str(k)))
frame.setVisible(True)
上述程式碼的輸出如下:
Jython BorderLayout
BorderLayout 管理器將容器劃分為五個地理區域,並在每個區域中放置一個元件。這些區域由以下定義的常量表示:
- BorderLayout.NORTH
- BorderLayout.SOUTH
- BorderLayout.EAST
- BorderLayout.WEST
- BorderLayout.CENTER
讓我們考慮以下示例:
Jython BoxLayout
BoxLayout 類在javax.swing 包中定義。它用於在容器中垂直或水平排列元件。方向由以下常量確定:
- X_AXIS
- Y_AXIS
- LINE_AXIS
- PAGE_AXIS
整數常量指定應沿其佈局容器元件的軸。當容器具有預設元件方向時,LINE_AXIS 指定元件從左到右佈局,PAGE_AXIS 指定元件從上到下佈局。
在以下示例中,面板(JPanel 類)新增到 JFrame 物件中。垂直 BoxLayout 應用於它,並且兩個其他面板(頂部和底部)新增到它。這兩個內部面板分別有兩個按鈕以水平 Boxlayout 新增。
讓我們首先建立頂級 JFrame 視窗。
frame = JFrame()
frame.setTitle("Buttons")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 150)
JPanel 物件宣告為具有垂直 BoxLayout。將其新增到頂級框架中。
panel = JPanel() panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS)) frame.add(panel)
在此面板中,另外兩個面板頂部和底部新增到它。它們中的每一個都添加了兩個 JButton 物件,它們以水平方式新增,並以 25 畫素的空間分隔符分隔它們。
###top panel
top = JPanel()
top.setLayout(BoxLayout(top, BoxLayout.X_AXIS))
b1 = JButton("OK")
b2 = JButton("Close")
top.add(Box.createVerticalGlue())
top.add(b1)
top.add(Box.createRigidArea(Dimension(25, 0)))
top.add(b2)
類似地,構造底部面板。
###bottom panel
bottom = JPanel()
bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))
b3 = JButton("Open")
b4 = JButton("Save")
bottom.add(b3)
bottom.add(Box.createRigidArea(Dimension(25, 0)))
bottom.add(b4)
bottom.add(Box.createVerticalGlue())
請注意,createRigidArea()函式用於在兩個按鈕之間建立 25 畫素的空間。此外,createVerticalGlue()函式佔用佈局中的前導或尾隨空間。
首先,新增頂部和底部面板,並將框架的可見性屬性設定為 true。完整程式碼如下:
from java.awt import Dimension
from javax.swing import JButton, JFrame,JPanel,BoxLayout,Box
frame = JFrame()
frame.setTitle("Buttons")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 150)
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)
###top panel
top = JPanel()
top.setLayout(BoxLayout(top, BoxLayout.X_AXIS))
b1 = JButton("OK")
b2 = JButton("Close")
top.add(Box.createVerticalGlue())
top.add(b1)
top.add(Box.createRigidArea(Dimension(25, 0)))
top.add(b2)
###bottom panel
bottom = JPanel()
bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))
b3 = JButton("Open")
b4 = JButton("Save")
bottom.add(b3)
bottom.add(Box.createRigidArea(Dimension(25, 0)))
bottom.add(b4)
bottom.add(Box.createVerticalGlue())
panel.add(bottom)
panel.add(top)
frame.setVisible(True)
上述程式碼將生成以下輸出。
Jython GroupLayout
GroupLayout 管理器以分層方式對元件進行分組。分組由兩個類SequentialGroup和ParallelGroup完成,這兩個類都實現了 Java 中的 Group 介面。
佈局過程分為兩個步驟。在一步驟中,元件與水平軸一起放置,在第二步中與垂直軸一起放置。每個元件必須在佈局中定義兩次。
有兩種型別的排列,順序和並行。在這兩種情況下,我們都可以順序或並行地排列元件。在水平排列中,行稱為順序組,列稱為並行組。另一方面,在並行排列中,元素的行是並行組,列稱為順序。
在以下示例中,五個按鈕以三種方式排列在行和列中。首先,在 JFrame 視窗中新增 Jpanel 物件,並將其佈局設定為 Grouplayout。
frame = JFrame() panel = JPanel() frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) layout = GroupLayout(panel) panel.setLayout(layout)
然後構造 JButton 物件:
buttonD = JButton("D")
buttonR = JButton("R")
buttonY = JButton("Y")
buttonO = JButton("O")
buttonT = JButton("T")
接下來,我們建立一個名為LeftToRight的SequentialGroup,其中添加了 buttonD 和 buttonY。在它們之間,放置了一個 ParallelGroup ColumnMiddle(其中垂直添加了其他三個按鈕)。
leftToRight = layout.createSequentialGroup() leftToRight.addComponent(buttonD) columnMiddle = layout.createParallelGroup() columnMiddle.addComponent(buttonR) columnMiddle.addComponent(buttonO) columnMiddle.addComponent(buttonT) leftToRight.addGroup(columnMiddle) leftToRight.addComponent(buttonY)
現在是定義名為 TopToBottom 的垂直 SequentialGroup。新增三個按鈕的行 ParallelGroup,然後垂直新增其餘兩個按鈕。
topToBottom = layout.createSequentialGroup() rowTop = layout.createParallelGroup() rowTop.addComponent(buttonD) rowTop.addComponent(buttonR) rowTop.addComponent(buttonY) topToBottom.addGroup(rowTop) topToBottom.addComponent(buttonO) topToBottom.addComponent(buttonT)
最後,將 LeftToRight 組水平設定,並將 TopToBottom 組垂直設定為佈局物件。完整程式碼如下:
from javax.swing import JButton, JFrame,JPanel,GroupLayout
frame = JFrame()
panel = JPanel()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
layout = GroupLayout(panel)
panel.setLayout(layout)
buttonD = JButton("D")
buttonR = JButton("R")
buttonY = JButton("Y")
buttonO = JButton("O")
buttonT = JButton("T")
leftToRight = layout.createSequentialGroup()
leftToRight.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)
topToBottom = layout.createSequentialGroup()
rowTop = layout.createParallelGroup()
rowTop.addComponent(buttonD)
rowTop.addComponent(buttonR)
rowTop.addComponent(buttonY)
topToBottom.addGroup(rowTop)
topToBottom.addComponent(buttonO)
topToBottom.addComponent(buttonT)
layout.setHorizontalGroup(leftToRight)
layout.setVerticalGroup(topToBottom)
frame.add(panel)
frame.pack()
frame.setVisible(True)
上述程式碼的輸出如下: