Jython - 布局管理


Java 中的布局管理器是那些管理容器对象(如Frame、DialogPanel)中控件的放置的类。即使分辨率发生变化或框架本身大小发生调整,布局管理器也会保持框架中控件的相对位置。

这些类实现Layout 接口AWT 库中定义了以下布局管理器-

  • 边框布局
  • 流式布局
  • 网格布局
  • 卡片布局
  • 网格包布局

Swing 库中定义了以下布局管理器-

  • 盒子布局
  • 组布局
  • 滚动窗格布局
  • Spring布局

在下面的示例中,我们将使用 AWT 布局管理器以及 swing 布局管理器。

  • 绝对布局
  • 流程布局
  • 网格布局
  • 边框布局
  • 盒子布局
  • 集团布局

现在让我们详细讨论其中的每一个。

绝对布局

在探索上述所有布局管理器之前,我们必须了解容器中控件的绝对定位。我们必须将框架对象的布局方法设置为“无”。

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 对象并设置其位置和大小属性。

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)

要显示框架,请将其可见属性设置为 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 Swing

Jython 网格布局

网格布局管理器允许将控件放置在矩形网格中。网格的每个单元格中放置一个控件。

在以下示例中,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)

现在,通过将其尺寸指定为 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)))

最后将框架的可见性设置为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 代码

Jython 边框布局

BorderLayout 管理器将容器划分为五个地理区域,并在每个区域放置一个组件。这些区域由定义的常量表示,如下 -

  • 边框布局.NORTH
  • 边框布局.SOUTH
  • 边框布局.EAST
  • 边框布局.WEST
  • 边框布局.CENTER

让我们考虑以下示例 -

Jython 边框布局

Jython BoxLayout

BoxLayout 类在javax.swing 包中定义。它用于垂直或水平排列容器中的组件。方向由以下常数决定 -

  • X轴
  • Y轴
  • 线轴
  • 页轴

整数常量指定容器组件应沿其布置的轴。当容器具有默认的组件方向时,LINE_AXIS 指定组件从左到右布局,PAGE_AXIS 指定组件从上到下布局。

在以下示例中,面板(JPanel 类)添加到 JFrame 对象中。对其应用了 Vertical 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 BoxLayout

Jython 组布局

GroupLayout 管理器以分层方式对组件进行分组。分组是由两个类SequentialGroupParallelGroup完成的,它们都实现了 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)

现在是垂直 SequentialGroup 的定义,称为 TopToBottom。添加包含三个按钮的 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)

上述代码的输出如下 -

Jython 组布局