Jython-layout-management

提供:Dev Guides
移動先:案内検索

Jython-レイアウト管理

Javaのレイアウトマネージャーは、 Frame、DialogPanel などのコンテナーオブジェクト内のコントロールの配置を管理するクラスです。 レイアウトマネージャーは、解像度が変更されたり、フレーム自体のサイズが変更されたりしても、フレーム内のコントロールの相対的な配置を維持します。

これらのクラスは* Layoutインターフェース*を実装しています。 次のレイアウトマネージャーは* AWTライブラリ*で定義されています-

  • BorderLayout
  • FlowLayout
  • グリッドレイアウト
  • CardLayout
  • GridBagLayout

次のレイアウトマネージャーは* Swingライブラリ*で定義されています-

  • BoxLayout
  • GroupLayout
  • ScrollPaneLayout
  • SpringLayout

次の例では、AWTレイアウトマネージャーとSwingレイアウトマネージャーを使用します。

  • 絶対レイアウト
  • フローレイアウト
  • グリッドレイアウト
  • ボーダーレイアウト
  • ボックスレイアウト
  • グループレイアウト

次に、これらのそれぞれについて詳しく説明します。

絶対レイアウト

上記のすべてのレイアウトマネージャーを検討する前に、コンテナー内のコントロールの絶対配置を確認する必要があります。 フレームオブジェクトのレイアウト方法を「なし」に設定する必要があります。

frame.setLayout(None)

次に、* setBounds()*メソッドを呼び出してコントロールを配置します。 x位置、y位置、幅、高さの4つの引数を取ります。

たとえば、ボタンオブジェクトを絶対位置に絶対サイズで配置する場合。

btn = JButton("Add")
btn.setBounds(60,80,60,20)

同様に、位置とサイズを適切に割り当てることにより、すべてのコントロールを配置できます。 このレイアウトは比較的簡単に使用できますが、ウィンドウのサイズが変更されたり、画面の解像度が変更されたときにプログラムが実行されたりすると、外観を維持できません。

次のJythonスクリプトでは、3つのJlabelオブジェクトを使用して、それぞれテキスト「phy」、「maths」、および「Total」を表示します。 これら3つの前に-JTextFieldオブジェクトが配置されます。 Buttonオブジェクトは、「Total」ラベルの上に配置されます。

まず、レイアウトをnoneに設定して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)

上記のコードの出力は次のとおりです。

追加

Jython FlowLayout

FlowLayoutは、コンテナクラスのデフォルトのレイアウトマネージャーです。 コントロールを左から右へ、そして上から下へと配置します。

次の例では、FlowLayoutマネージャーを使用して、Jlabelオブジェクト、JTextFieldオブジェクト、およびJButtonオブジェクトを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")

最後に、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 Swingへようこそ

Jython GridLayout

Gridlayoutマネージャーでは、長方形のグリッドにコントロールを配置できます。 グリッドの各セルに1つのコントロールが配置されます。

次の例では、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))

ここで、それぞれ1から4までの2つの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に設定します。 完全な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 Code

Jython BorderLayout

BorderLayoutマネージャーは、コンテナーを5つの地理的地域と場所に分割し、各地域に1つのコンポーネントを配置します。 これらの領域は、次のように定義された定数で表されます-

  • BorderLayout.NORTH
  • BorderLayout.SOUTH
  • 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はコンポーネントを上から下に配置することを指定します。

次の例では、(JPanelクラスの)パネルがJFrameオブジェクトに追加されます。 垂直BoxLayoutが適用され、さらに2つのパネル(上部と下部)が追加されます。 これらの2つの内部パネルには、水平のBoxlayoutにそれぞれ追加された2つのボタンがあります。

最初にトップレベルの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)

このパネルでは、上下に2つのパネルが追加されます。 それぞれに2つの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()関数は、2つのボタンの間に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 BoxLayout

Jython GroupLayout

GroupLayoutマネージャーは、コンポーネントを階層的にグループ化します。 グループ化は、 SequentialGroup および ParallelGroup の2つのクラスによって行われ、どちらもJavaでGroupインターフェースを実装します。

レイアウト手順は2つのステップに分かれています。 ワンステップでは、コンポーネントは水平軸に沿って配置され、2番目は垂直軸に沿って配置されます。 各コンポーネントは、レイアウトで2回定義する必要があります。

配列には、順次配列と並列配列の2種類があります。 どちらの場合も、コンポーネントを順次または並列に配置できます。 水平配置では、行は順次グループと呼ばれ、列は並列グループと呼ばれます。 一方、並列配置では、要素の行は並列グループと列であり、これは順次と呼ばれます。

次の例では、5つのボタンが、それぞれが行と列に表示されるように配置されています。 まず、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")

次に、buttonDとbuttonYが追加される LeftToRight という名前の SequentialGroup を作成します。 それらの間に、ParallelGroup ColumnMiddle(他の3つのボタンが垂直に追加されます)が配置されます。

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の定義があります。 3つのボタンのParallelGroup行を追加し、2つのボタンを垂直に置きます。

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 GroupLayout