Jython 简明教程

Jython - Layout Management

Java 中的布局管理器是一类,它们管理控件在容器对象中的放置,如 Frame, DialogPanel 。布局管理器维护控件在框架中的相对位置,即使分辨率更改或框架本身调整大小。

这些类实现了 Layout interface 。以下布局管理器定义在 AWT library 中:

  1. BorderLayout

  2. FlowLayout

  3. GridLayout

  4. CardLayout

  5. GridBagLayout

以下布局管理器定义在 Swing library 中:

  1. BoxLayout

  2. GroupLayout

  3. ScrollPaneLayout

  4. SpringLayout

我们将在以下示例中使用 AWT 布局管理器和 swing 布局管理器。

  1. Absolute Layout

  2. Flow Layout

  3. Grid Layout

  4. Border Layout

  5. Box Layout

  6. Group Layout

让我们现在详细讨论每一个这些。

Absolute Layout

在我们探索以上所有布局管理器之前,必须查看容器中控件的绝对定位。我们必须将框架对象的布局方法设置为“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)

以上代码的输出如下。

add

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 对象并设置它的位置以及大小属性。

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)
welcome to jython swing

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 乘 4。

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)))

最后将框架的可见性设置为真。完整的 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 code

Jython BorderLayout

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

  1. BorderLayout.NORTH

  2. BorderLayout.SOUTH

  3. BorderLayout.EAST

  4. BorderLayout.WEST

  5. BorderLayout.CENTER

我们考虑以下示例:

jython borderlayout

Jython BoxLayout

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

  1. X_AXIS

  2. Y_AXIS

  3. LINE_AXIS

  4. 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() 函数还占据布局的前导或尾随空间。

首先,添加顶部和底部面板,并将 frame 的可见性属性设置为真。完整的代码如下所示:

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

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")

接下来,我们创建一个名为 LeftToRightSequentialGroup ,其中添加了 buttonD 和 buttonY。在其间,放置了一个并行组 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)

以上代码的输出如下所示 -

jython grouplayout