Jython 布局管理

Jython 布局管理

在Java中,布局管理器是负责管理容器对象中控件的摆放位置的类,例如 Frame, DialogPanel 。无论分辨率如何变化或框架本身如何调整大小,布局管理器都可以维护控件在框架中的相对位置。

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

  • BorderLayout
  • FlowLayout
  • GridLayout
  • CardLayout
  • GridBagLayout

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

  • BoxLayout
  • GroupLayout
  • ScrollPaneLayout
  • SpringLayout

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

  • Absolute Layout
  • Flow Layout
  • Grid Layout
  • Border Layout
  • Box Layout
  • 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”。在这三个Jlabel对象前面,放置了JtextField对象。在“Total”标签的上面放置了一个Button对象。

首先创建一个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 布局管理

Jython 流布局

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)

要显示框架,将其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 布局管理

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)

现在,通过指定 4×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
  • BorderLayout.SOUTH
  • BorderLayout.EAST
  • BorderLayout.WEST
  • BorderLayout.CENTER

让我们考虑以下示例:

Jython 布局管理

Jython BoxLayout

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

  • X_AXIS
  • Y_AXIS
  • LINE_AXIS
  • PAGE_AXIS

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

在下面的示例中,将panel(JPanel类)添加到JFrame对象中。给它应用了垂直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)

在此面板中,还添加了两个上下方面板。每个面板水平添加了两个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 布局管理

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

下一步,我们创建一个 SequentialGroup ,名称为 LeftToRight ,向其中添加了buttonD和buttonY。它们之间,放置了一个名为 ColumnMiddleParallelGroup (垂直添加了其他三个按钮)。

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 布局管理

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程