开发手册 欢迎您!
软件开发者资料库

Jython - 布局管理

Jython布局管理 - 从简单和简单的步骤学习Jython,从基本到高级概念,包括概述,安装,导入Java库,变量和数据类型,使用Java集合类型,决策控制,循环,函数,模块,包,Java应用程序,Eclipse插件,Eclipse中的项目,NetBeans插件和项目,Servlet,JDBC,使用Swing GUI库,布局管理,事件处理,菜单,对话框。

Java中的布局管理器是那些管理容器对象中控件放置的类,如框架,对话框面板.布局管理器维护控件在帧中的相对位置,即使分辨率更改或帧本身已调整大小.

这些类实现布局界面.以下布局管理器在 AWT库中定义 :

  • BorderLayout

  • FlowLayout

  • GridLayout

  • CardLayout

  • GridBagLayout

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

  • BoxLayout

  • GroupLayout

  • ScrollPaneLayout

  • SpringLayout

我们将在以下示例中使用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, JTextFieldframe = 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(1205060,20)btn = JButton("Add")btn.setBounds(60,80,60,20)lbl3 = JLabel("Total")lbl3.setBounds(60,110,40,20)txt3 = JTextField(10)txt3.setBounds(12011060,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是容器类的默认布局管理器.它从左到右,然后从上到下排列控制.

在下面的示例中,Jlabel对象,JTextField对象和JButton对象将使用FlowLayout显示在JFrame中经理.首先,让我们从 javax.swing 包和 java.awt 包中导入所需的类.

from javax.swing import JFrameJLabelJButtonJTextFieldfrom java.awt import FlowLayout

然后创建一个JFrame对象并设置它的Location以及大小属性.

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, JTextFieldfrom java.awt import FlowLayoutframe = 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

Gridlayout管理器允许在矩形网格中放置控件.一个控件放置在网格的每个单元格中.

在下面的示例中,GridLayout应用于JFrame对象,将其分为4行和4列. JButton对象将被放置在网格的每个单元格中.

让我们先导入所需的库 :

from javax.swing import JFrameJButtonfrom 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,所以十六个JButton对象放在后续单元格中.

k = 0frame.setLayout(GridLayout(4,4))for i in range(1,5):   for j in range(1,5):      k = k+1      frame.add(JButton(str(k)))

最后将frame的可见性设置为true.完整的Jython代码如下所示.

from javax.swing import JFrame, JButtonfrom java.awt import GridLayoutframe = JFrame("Hello")frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)frame.setLocation(100,100)frame.setSize(400,400)frame.setLayout(GridLayout(4,4))k = 0for 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管理器将容器划分为五个地理区域和每个区域中有一个组件的位置.这些区域由定义的常量表示如下 :

  • BorderLayout.NORTH

  • BorderLayout.南

  • BorderLayout.EAST

  • BorderLayout.WEST

  • BorderLayout.CENTER

让我们考虑以下示例 :

Jython BorderLayout

Jython BoxLayout

BoxLayout类在 javax.swing包中定义.它用于垂直或水平安排容器中的组件.方向由以下常数和减号确定;

  • X_AXIS

  • Y_AXIS

  • LINE_AXIS

  • PAGE_AXIS

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

在下面例如,在JFrame对象中添加了(JPanel类的)面板.垂直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 paneltop = 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(250)))top.add(b2)

同样,底部面板是构造的.

###bottom panelbottom = JPanel()bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))b3 = JButton("Open")b4 = JButton("Save")bottom.add(b3)bottom.add(Box.createRigidArea(Dimension(250)))bottom.add(b4)bottom.add(Box.createVerticalGlue())

请注意, createRigidArea()函数用于在两个之间创建25像素的空间纽扣.此外, createVerticalGlue()函数占据布局中的前导或尾随空格.

首先,添加顶部和底部面板并设置visibility属性框架为真.完整的代码如下&&;

from java.awt import Dimensionfrom javax.swing import JButton, JFrame,JPanel,BoxLayout,Boxframe = JFrame()frame.setTitle("Buttons")frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)frame.setSize(300150)panel = JPanel()panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))frame.add(panel)###top paneltop = 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(250)))top.add(b2)###bottom panelbottom = JPanel()bottom.setLayout(BoxLayout(bottom, BoxLayout.X_AXIS))b3 = JButton("Open")b4 = JButton("Save")bottom.add(b3)bottom.add(Box.createRigidArea(Dimension(250)))bottom.add(b4)bottom.add(Box.createVerticalGlue())panel.add(bottom)panel.add(top)frame.setVisible(True)

以上代码将生成以下输出.

Jython BoxLayout

Jython GroupLayout

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)

现在出现了名为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,GroupLayoutframe = 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