Jython - Gestione del layout

I gestori di layout in Java sono classi che gestiscono il posizionamento dei controlli negli oggetti contenitore come Frame, Dialog o Panel. I gestori di layout mantengono il posizionamento relativo dei controlli in un frame, anche se la risoluzione cambia o il frame stesso viene ridimensionato.

Queste classi implementano il Layout interface. I seguenti gestori di layout sono definiti nel fileAWT library -

  • BorderLayout
  • FlowLayout
  • GridLayout
  • CardLayout
  • GridBagLayout

I seguenti gestori di layout sono definiti nel file Swing library -

  • BoxLayout
  • GroupLayout
  • ScrollPaneLayout
  • SpringLayout

Useremo gestori di layout AWT e gestori di layout swing nei seguenti esempi.

  • Layout assoluto
  • Layout di flusso
  • Layout della griglia
  • Layout del bordo
  • Layout della scatola
  • Layout di gruppo

Discutiamo ora ciascuno di questi in dettaglio.

Layout assoluto

Prima di esplorare tutti i gestori di layout di cui sopra, dobbiamo esaminare il posizionamento assoluto dei controlli in un contenitore. Dobbiamo impostare il metodo di layout dell'oggetto frame su "Nessuno".

frame.setLayout(None)

Quindi posizionare il controllo chiamando il setBounds()metodo. Richiede quattro argomenti: posizione x, posizione y, larghezza e altezza.

Ad esempio: per posizionare un oggetto pulsante nella posizione assoluta e con la dimensione assoluta.

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

Allo stesso modo, tutti i controlli possono essere posizionati allocando correttamente posizione e dimensione. Questo layout è relativamente facile da usare, ma non mantiene il suo aspetto quando la finestra viene ridimensionata o se il programma viene eseguito quando la risoluzione dello schermo cambia.

Nel seguente script Jython, tre oggetti Jlabel vengono utilizzati per visualizzare rispettivamente il testo "phy", "maths" e "Total". Davanti a questi tre oggetti vengono posizionati JTextField. Un oggetto Button viene posizionato sopra l'etichetta "Total".

Prima di tutto la finestra JFrame viene creata con un layout impostato su nessuno.

frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,200)
frame.setLayout(None)

Quindi vengono aggiunti diversi controlli in base alla loro posizione e dimensione assoluta. Il codice completo è dato di seguito -

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)

L'output per il codice precedente è il seguente.

Jython FlowLayout

FlowLayout è il gestore di layout predefinito per le classi contenitore. Organizza il controllo da sinistra a destra e quindi dall'alto verso il basso.

Nell'esempio seguente, un oggetto Jlabel, un oggetto JTextField e un oggetto JButton devono essere visualizzati in un JFrame utilizzando il gestore FlowLayout. Per cominciare, importiamo le classi richieste dal filejavax.swing pacchetto e il java.awt pacchetto.

from javax.swing import JFrame, JLabel, JButton, JTextField
from java.awt import FlowLayout

Quindi crea un oggetto JFrame e imposta la sua posizione e le proprietà della dimensione.

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

Ora dichiara gli oggetti per le classi JLabel, JTextfield e JButton.

label = JLabel("Welcome to Jython Swing")
txt = JTextField(30)
btn = JButton("ok")

Infine aggiungi questi controlli nel frame chiamando il file add() metodo della classe JFrame.

frame.add(label)
frame.add(txt)
frame.add(btn)

Per visualizzare il frame, impostare la sua proprietà visible su true. Lo script Jython completo e il suo output sono i seguenti:

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

Il gestore Gridlayout consente il posizionamento dei controlli in una griglia rettangolare. Un controllo viene inserito in ogni cella della griglia.

Nell'esempio seguente, GridLayout viene applicato a un oggetto JFrame dividendolo in 4 righe e 4 colonne. Un oggetto JButton deve essere posizionato in ogni cella della griglia.

Per prima cosa importiamo le librerie richieste -

from javax.swing import JFrame, JButton
from java.awt import GridLayout

Quindi crea il contenitore JFrame -

frame = JFrame("Hello")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(400,400)

Ora, applica GridLayout specificando le sue dimensioni come 4 per 4.

frame.setLayout(GridLayout(4,4))

Ora dovremmo usare due cicli FOR, ciascuno da 1 a 4, quindi sedici oggetti JButton vengono posizionati nelle celle successive.

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

Infine imposta la visibilità del frame su true. Di seguito viene fornito il codice Jython completo.

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)

L'output del codice sopra è il seguente:

Jython BorderLayout

Il gestore BorderLayout divide il contenitore in cinque aree geografiche e luoghi con un componente in ciascuna regione. Queste regioni sono rappresentate da costanti definite come segue:

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

Consideriamo il seguente esempio:

Jython BoxLayout

La classe BoxLayout è definita nel file javax.swing package. Viene utilizzato per disporre i componenti nel contenitore verticalmente o orizzontalmente. La direzione è determinata dalle seguenti costanti:

  • X_AXIS
  • Y_AXIS
  • LINE_AXIS
  • PAGE_AXIS

La costante intera specifica l'asse lungo il quale devono essere disposti i componenti del contenitore. Quando il contenitore ha l'orientamento del componente predefinito, LINE_AXIS specifica che i componenti devono essere disposti da sinistra a destra e PAGE_AXIS specifica che i componenti devono essere disposti dall'alto verso il basso.

Nell'esempio seguente, pannello (della classe JPanel) viene aggiunto in un oggetto JFrame. Viene applicato il BoxLayout verticale e vengono aggiunti altri due pannelli, superiore e inferiore. Questi due pannelli interni hanno due pulsanti aggiunti ciascuno nel Boxlayout orizzontale.

Creiamo prima la finestra JFrame di primo livello.

frame = JFrame()
frame.setTitle("Buttons")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 150)

L'oggetto JPanel è dichiarato con un BoxLayout verticale. Aggiungilo nella cornice di primo livello.

panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)

In questo pannello, vengono aggiunti altri due pannelli superiore e inferiore. Ognuno di loro ha due oggetti JButton aggiunti orizzontalmente con un contenitore di spazio di 25 pixel che li separa.

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

Allo stesso modo, viene costruito il pannello inferiore.

###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())

Nota che il createRigidArea()viene utilizzata per creare uno spazio di 25 pixel tra due pulsanti. Anche ilcreateVerticalGlue() la funzione occupa lo spazio iniziale o finale nel layout.

Per cominciare, aggiungi i pannelli superiore e inferiore e imposta la proprietà di visibilità del frame su true. Il codice completo è il seguente:

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)

Il codice precedente genererà il seguente output.

Jython GroupLayout

Il manager GroupLayout raggruppa i componenti in modo gerarchico. Il raggruppamento è fatto da due classi,SequentialGroup e ParallelGroup, entrambi implementano l'interfaccia di gruppo in Java.

La procedura di layout è divisa in due fasi. In una fase, i componenti vengono posizionati lungo l'asse orizzontale e nella seconda lungo l'asse verticale. Ogni componente deve essere definito due volte nel layout.

Esistono due tipi di arrangiamenti, sequenziali e paralleli. In entrambi possiamo disporre i componenti in sequenza o in parallelo. Nella disposizione orizzontale, la riga è chiamata gruppo sequenziale e la colonna è chiamata gruppo parallelo. D'altra parte, in disposizione parallela, la riga dell'elemento è un gruppo parallelo e una colonna, che è chiamata sequenziale.

Nell'esempio seguente, cinque pulsanti sono disposti in modo tale che tre appaiano ciascuno in riga e colonna. Per cominciare, aggiungi un oggetto Jpanel in una finestra JFrame e imposta il suo layout come Grouplayout.

frame =  JFrame()
panel =  JPanel()
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
layout =  GroupLayout(panel)
panel.setLayout(layout)

Quindi costruisci gli oggetti JButton -

buttonD = JButton("D")
buttonR = JButton("R")
buttonY = JButton("Y")
buttonO = JButton("O")
buttonT = JButton("T")

Successivamente, creiamo un file SequentialGroup di nome LeftToRighta cui vengono aggiunti buttonD e buttonY. Tra di loro, viene posizionato un ParallelGroup ColumnMiddle (con altri tre pulsanti aggiunti verticalmente).

leftToRight = layout.createSequentialGroup()
leftToRight.addComponent(buttonD)
columnMiddle = layout.createParallelGroup()
columnMiddle.addComponent(buttonR)
columnMiddle.addComponent(buttonO)
columnMiddle.addComponent(buttonT)
leftToRight.addGroup(columnMiddle)
leftToRight.addComponent(buttonY)

Ora arriva la definizione di SequentialGroup verticale chiamato TopToBottom. Aggiungere una riga ParallelGroup di tre pulsanti e quindi posizionare due pulsanti verticalmente.

topToBottom = layout.createSequentialGroup()
rowTop = layout.createParallelGroup()
rowTop.addComponent(buttonD)
rowTop.addComponent(buttonR)
rowTop.addComponent(buttonY)
topToBottom.addGroup(rowTop)
topToBottom.addComponent(buttonO)
topToBottom.addComponent(buttonT)

Infine, imposta il gruppo LeftToRight orizzontalmente e TopToBottom verticalmente sull'oggetto del formato. Il codice completo è dato di seguito -

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)

L'output del codice sopra è il seguente: