- Jython 教程
- Jython - 主页
- Jython - 概述
- Jython - 安装
- Jython - 导入 Java 库
- Jython - 变量和数据类型
- Jython - 使用 Java 集合类型
- Jython - 决策控制
- Jython - 循环
- Jython - 函数
- Jython - 模块
- Jython - 包
- Jython - Java 应用程序
- Jython - Eclipse 插件
- Jython - Eclipse 中的项目
- Jython - NetBeans 插件和项目
- Jython - Servlet
- Jython-JDBC
- Jython - 使用 Swing GUI 库
- Jython - 布局管理
- Jython - 事件处理
- Jython - 菜单
- Jython - 对话框
- Jython 有用资源
- Jython - 快速指南
- Jython - 有用的资源
- Jython - 讨论
Jython - 布局管理
Java 中的布局管理器是那些管理容器对象(如Frame、Dialog或Panel)中控件的放置的类。即使分辨率发生变化或框架本身大小发生调整,布局管理器也会保持框架中控件的相对位置。
这些类实现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 网格布局
网格布局管理器允许将控件放置在矩形网格中。网格的每个单元格中放置一个控件。
在以下示例中,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 边框布局
BorderLayout 管理器将容器划分为五个地理区域,并在每个区域放置一个组件。这些区域由定义的常量表示,如下 -
- 边框布局.NORTH
- 边框布局.SOUTH
- 边框布局.EAST
- 边框布局.WEST
- 边框布局.CENTER
让我们考虑以下示例 -
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 组布局
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)
现在是垂直 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)
上述代码的输出如下 -