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(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是容器类的默认布局管理器.它从左到右,然后从上到下排列控制.
在下面的示例中,Jlabel对象,JTextField对象和JButton对象将使用FlowLayout显示在JFrame中经理.首先,让我们从 javax.swing 包和 java.awt 包中导入所需的类.
from javax.swing import JFrame, JLabel, JButton, JTextFieldfrom 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 GridLayout
Gridlayout管理器允许在矩形网格中放置控件.一个控件放置在网格的每个单元格中.
在下面的示例中,GridLayout应用于JFrame对象,将其分为4行和4列. JButton对象将被放置在网格的每个单元格中.
让我们先导入所需的库 :
from javax.swing import JFrame, JButtonfrom 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 BorderLayout
BorderLayout管理器将容器划分为五个地理区域和每个区域中有一个组件的位置.这些区域由定义的常量表示如下 :
BorderLayout.NORTH
BorderLayout.南
BorderLayout.EAST
BorderLayout.WEST
BorderLayout.CENTER
让我们考虑以下示例 :
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(25, 0)))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(25, 0)))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(300, 150)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(25, 0)))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(25, 0)))bottom.add(b4)bottom.add(Box.createVerticalGlue())panel.add(bottom)panel.add(top)frame.setVisible(True)
以上代码将生成以下输出.
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)
上面代码的输出如下 :