자이 썬-레이아웃 관리

Java의 레이아웃 관리자는 다음과 같은 컨테이너 개체의 컨트롤 배치를 관리하는 클래스입니다. Frame, Dialog 또는 Panel. 레이아웃 관리자는 해상도가 변경되거나 프레임 자체의 크기가 조정 되더라도 프레임에서 컨트롤의 상대적 위치를 유지합니다.

이 클래스는 Layout interface. 다음 레이아웃 관리자는AWT library

  • BorderLayout
  • FlowLayout
  • GridLayout
  • CardLayout
  • GridBagLayout

다음 레이아웃 관리자는 Swing library

  • BoxLayout
  • GroupLayout
  • ScrollPaneLayout
  • SpringLayout

다음 예제에서는 AWT 레이아웃 관리자와 스윙 레이아웃 관리자를 사용합니다.

  • 절대 레이아웃
  • 흐름 레이아웃
  • 그리드 레이아웃
  • 테두리 레이아웃
  • 상자 레이아웃
  • 그룹 레이아웃

이제 각각에 대해 자세히 설명하겠습니다.

절대 레이아웃

위의 레이아웃 관리자를 모두 살펴보기 전에 컨테이너에서 컨트롤의 절대 위치를 확인해야합니다. 프레임 개체의 레이아웃 방식을 '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 창이 생성됩니다.

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)

위 코드의 출력은 다음과 같습니다.

자이 썬 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")

마지막으로 프레임에 이러한 컨트롤을 추가합니다. add() JFrame 클래스의 메소드.

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)

자이 썬 GridLayout

Gridlayout 관리자를 사용하면 사각형 격자에 컨트롤을 배치 할 수 있습니다. 그리드의 각 셀에 하나의 컨트롤이 배치됩니다.

다음 예제에서 GridLayout은 4 개의 행과 4 개의 열로 나누어 진 JFrame 객체에 적용됩니다. 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)

이제 크기를 4x4로 지정하여 GridLayout을 적용합니다.

frame.setLayout(GridLayout(4,4))

이제 각각 1에서 4까지의 두 개의 FOR 루프를 사용해야하므로 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로 설정합니다. 완전한 자이 썬 코드는 아래와 같습니다.

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)

위 코드의 출력은 다음과 같습니다.

자이 썬 BorderLayout

BorderLayout 관리자는 컨테이너를 5 개의 지리적 영역과 각 영역에 하나의 구성 요소로 배치합니다. 이 영역은 다음과 같이 정의 된 상수로 표시됩니다.

  • BorderLayout.NORTH
  • BorderLayout.SOUTH
  • BorderLayout.EAST
  • BorderLayout.WEST
  • BorderLayout.CENTER

다음 예를 살펴 보겠습니다.

자이 썬 BoxLayout

BoxLayout 클래스는 javax.swing package. 컨테이너의 구성 요소를 수직 또는 수평으로 배열하는 데 사용됩니다. 방향은 다음 상수에 의해 결정됩니다-

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

위의 코드는 다음 출력을 생성합니다.

자이 썬 GroupLayout

GroupLayout 관리자는 계층 적 방식으로 구성 요소를 그룹화합니다. 그룹화는 두 클래스로 이루어집니다.SequentialGroupParallelGroup, 둘 다 Java에서 그룹 인터페이스를 구현합니다.

레이아웃 절차는 두 단계로 나뉩니다. 한 단계에서 구성 요소는 수평 축을 따라 배치되고 두 번째는 수직 축을 따라 배치됩니다. 각 구성 요소는 레이아웃에서 두 번 정의되어야합니다.

배열에는 순차와 병렬의 두 가지 유형이 있습니다. 두 가지 모두 구성 요소를 순차적으로 또는 병렬로 배열 할 수 있습니다. 가로 배열에서 행을 순차 그룹이라고하고 열을 병렬 그룹이라고합니다. 반면에 병렬 배열에서 요소의 행은 병렬 그룹과 열로,이를 순차라고합니다.

다음 예에서는 5 개의 버튼이 각각 행과 열에 3 개씩 나타나는 방식으로 배열됩니다. 먼저 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 명명 된 LeftToRightbuttonD 및 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,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)

위 코드의 출력은 다음과 같습니다.