Java 中的布局管理器是类,它们管理控件在容器对象(如 Frame、Dialog 或 Panel)中的放置。布局 管理 器保持控件在框架中的相对位置,即使分辨率发生变化或框架本身被调整了大小。
这些类实现 Layout 接口。以下布局 管理 器在 AWT 库中定义 -
- BorderLayout
- FlowLayout
- GridLayout
- CardLayout
- GridBagLayout
以下布局 管理 器在 Swing 库中定义 -
- BoxLayout
- GroupLayout
- ScrollPaneLayout
- SpringLayout
在以下示例中,我们将使用 AWT 布局 管理 器以及 swing 布局 管理 器。
- Absolute 布局
- Flow 布局
- Grid 布局
- Border 布局
- Box 布局
- Group 布局
现在让我们详细讨论一下这些中的每一个。
绝对布局
在我们探索上述所有布局 管理 器之前,我们必须查看控件在容器中的绝对位置。我们必须将 frame 对象的布局方法设置为 '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 是容器类的默认布局 管理 器。它从左到右,然后从上到下方向排列控制。
在以下示例中,将使用 FlowLayout 管理器在 JFrame 中显示 Jlabel 对象、JTextField 对象和 JButton 对象。首先,让我们从 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)
现在,通过将 GridLayout 的尺寸指定为 4 x 4 来应用 GridLayout。
frame.setLayout(GridLayout(4,4))
现在我们应该使用两个 FOR 循环,每个循环从 1 到 4,因此在后续单元格中放置了 16 个 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)))
最后,将 visibility of frame 设置为 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 对象中。Vertical BoxLayout 应用于它,并向其添加了另外两个面板 top 和 bottom。这两个内部面板有两个按钮,每个按钮都添加到水平 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)
在此面板中,添加了另外两个面板 top 和 bottom。每个对象都水平添加了两个 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() 函数在布局中占据前导或尾随空间。
首先,添加顶部和底部面板,并将框架的 visibility 属性设置为 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 manager 以分层方式对组件进行分组。分组由两个类 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.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)
现在是名为 TopToBottom 的垂直 SequentialGroup 的定义。添加一行三个按钮的 ParallelGroup,然后垂直放置两个按钮。
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)
上述代码的输出如下 -
