Jython - Gestione degli eventi

La gestione degli eventi in Java swing richiede che il controllo (come JButton o JList ecc.) Venga registrato con il rispettivo listener di eventi. L'interfaccia del listener di eventi o la classe Adapter corrispondente deve essere implementata o sottoclasse con il relativo metodo di gestione degli eventi sovrascritto. In Jython, la gestione degli eventi è molto semplice. Possiamo passare qualsiasi funzione come proprietà della funzione di gestione degli eventi corrispondente al controllo.

Vediamo prima come viene gestito un evento clic in Java.

Per cominciare, dobbiamo importare il file java.awt.event package. Successivamente, la classe che estende JFrame deve implementare l'interfaccia ActionListener.

public class btnclick extends JFrame implements ActionListener

Quindi, dobbiamo dichiarare l'oggetto JButton, aggiungerlo al ContentPane del frame e quindi registrarlo con ActionListener tramite il metodo addActionListener ().

JButton b1 = new JButton("Click here");
   getContentPane().add(b1);
   b1.addActionListener(this);

Ora, il metodo actionPerformed () dell'interfaccia ActionListener deve essere sovrascritto per gestire ActionEvent.

Di seguito è riportato l'intero codice Java -

import java.awt.event.*;
import javax.swing.*;
public class btnclick extends JFrame implements ActionListener {
   btnclick() {
      JButton b1 = new JButton("Click here");
      getContentPane().add(b1);
      b1.addActionListener(this);
   }
   
   public void actionPerformed(ActionEvent e) {
      System.out.println("Clicked");
   }
   
   public static void main(String args[]) {
      btnclick b = new btnclick();
      b.setSize(300,200);
      b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      b.setVisible(true);
   }
}

Ora scriveremo il codice Jython equivalente allo stesso codice.

Per cominciare, non abbiamo bisogno di importare ActionEvent o ActionListener, poiché la tipizzazione dinamica di Jython ci consente di evitare di menzionare queste classi nel nostro codice.

In secondo luogo, non è necessario implementare o creare una sottoclasse di ActionListener. Al contrario, qualsiasi funzione definita dall'utente viene immediatamente fornita al costruttore JButton come valore diactionPerformed proprietà del fagiolo.

button = JButton('Click here!', actionPerformed = clickhere)

Il clickhere() è definita come una normale funzione Jython, che gestisce l'evento click sul pulsante.

def change_text(event):
print clicked!'

Ecco il codice equivalente a Jython.

from javax.swing import JFrame, JButton

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

def clickhere(event):
   print "clicked"

btn = JButton("Add", actionPerformed = clickhere)
frame.add(btn)

frame.setVisible(True)

L'output del codice Java e Jython è identico. Quando si fa clic sul pulsante, verrà stampato il messaggio "cliccato" sulla console.

Nel seguente codice Jython, due oggetti JTextField sono forniti nella finestra JFrame per inserire i contrassegni in "phy" e "maths". L'oggetto JButton esegue la funzione add () quando viene cliccato.

btn = JButton("Add", actionPerformed = add)

La funzione add () legge il contenuto di due campi di testo con il metodo getText () e li analizza in numeri interi, in modo che sia possibile eseguire l'addizione. Il risultato viene quindi inserito nel terzo campo di testo dal metodo setText ().

def add(event):
   print "add"
   ttl = int(txt1.getText())+int(txt2.getText())
   txt3.setText(str(ttl))

Il codice completo è dato di seguito -

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

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

def add(event):
   print "add"
   ttl = int(txt1.getText())+int(txt2.getText())
   txt3.setText(str(ttl))

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", actionPerformed = 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)

Quando il codice precedente viene eseguito dal prompt dei comandi, viene visualizzata la seguente finestra. Immettere i segni per "Phy", Maths "e fare clic sul pulsante" Aggiungi ". Il risultato verrà visualizzato di conseguenza.

Evento Jython JRadioButton

La classe JRadioButton è definita nel file javax.swing package. Crea un pulsante di attivazione / disattivazione selezionabile con stati di attivazione o disattivazione. Se più pulsanti di opzione vengono aggiunti in un ButtonGroup, la loro selezione si esclude a vicenda.

Nell'esempio seguente, due oggetti della classe JRadioButton e due JLabel vengono aggiunti a un contenitore Jpanel in un BoxLayout verticale. Nel costruttore degli oggetti JRadioButton, ilOnCheck()function è impostata come valore della proprietà actionPerformed. Questa funzione viene eseguita quando si fa clic sul pulsante di opzione per modificarne lo stato.

rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)

Tieni presente che lo stato predefinito del pulsante di opzione è falso (non selezionato). Il pulsante rb1 viene creato con lo stato iniziale True (selezionato).

I due pulsanti di opzione vengono aggiunti a un ButtonGroup di opzione per renderli mutuamente esclusivi, in modo che se uno è selezionato, l'altro viene deselezionato automaticamente.

grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)

Questi due pulsanti di opzione insieme a due etichette vengono aggiunti a un oggetto pannello nel layout verticale con un'area di separazione di 25 pixel in altezze comprese tra rb2 e lbl2.

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

panel.add(Box.createVerticalGlue())
panel.add(lbl)
panel.add(rb1)
panel.add(rb2)
panel.add(Box.createRigidArea(Dimension(0,25)))
panel.add(lbl1)

Questo pannello viene aggiunto a un oggetto JFrame di primo livello, la cui proprietà visible è impostata su "True" alla fine.

frame = JFrame("JRadioButton Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,200)
frame.setVisible(True)
The complete code of radio.py is given below:
from javax.swing import JFrame, JPanel, JLabel, BoxLayout, Box

from java.awt import Dimension
from javax.swing import JRadioButton,ButtonGroup
frame = JFrame("JRadioButton Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,200)
panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
frame.add(panel)

def OnCheck(event):
   lbl1.text = ""
   if rb1.isSelected():
      lbl1.text = lbl1.text+"Gender selection : Male"
   else:
      lbl1.text = lbl1.text+"Gender selection : Female "
      lbl = JLabel("Select Gender")

rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)

lbl1 = JLabel("Gender Selection :")

panel.add(Box.createVerticalGlue())
panel.add(lbl)
panel.add(rb1)
panel.add(rb2)
panel.add(Box.createRigidArea(Dimension(0,25)))
panel.add(lbl1)

frame.setVisible(True)

Esegui lo script Jython sopra e modifica la selezione del pulsante di opzione. La selezione apparirà nell'etichetta in basso.

Evento Jython JCheckBox

Come il JRadioButton, L'oggetto JCheckBox è anche un pulsante selezionabile con una casella rettangolare selezionabile oltre alla sua didascalia. Viene generalmente utilizzato per fornire all'utente l'opportunità di selezionare più opzioni dall'elenco di elementi.

Nell'esempio seguente, due caselle di controllo e un'etichetta dal pacchetto swing vengono aggiunte a un JPanel in BoxLayout verticale. L'etichetta in basso mostra lo stato di selezione istantanea di due caselle di controllo.

Entrambe le caselle di controllo vengono dichiarate con il costruttore con la proprietà actionPerformed impostata su OnCheck() funzione.

box1 = JCheckBox("Check1", actionPerformed = OnCheck)
box2 = JCheckBox("Check2", actionPerformed = OnCheck)

La funzione OnCheck () verifica lo stato di selezione di ciascuna casella di controllo e visualizza il messaggio corrispondente sull'etichetta in basso.

def OnCheck(event):
   lbl1.text = ""
   if box1.isSelected():
      lbl1.text = lbl1.text + "box1 selected "
   else:
      lbl1.text = lbl1.text + "box1 not selected "
   if box2.isSelected():
      lbl1.text = lbl1.text + "box2 selected"
   else:
      lbl1.text = lbl1.text + "box2 not selected"

Queste caselle e un oggetto JLabel vengono aggiunti a un JPanel con un segnaposto di 50 pixel di altezza aggiunto tra di loro.

panel = JPanel()
panel.setLayout(BoxLayout(panel, BoxLayout.Y_AXIS))
panel.add(Box.createVerticalGlue())
panel.add(box1)
panel.add(box2)
panel.add(Box.createRigidArea(Dimension(0,50)))
panel.add(lbl1)

Il pannello stesso viene aggiunto a una finestra JFrame di primo livello, la cui proprietà visible è impostata su true alla fine.

frame = JFrame("JCheckBox Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,150)
frame.add(panel)

frame.setVisible(True)

Eseguire il codice sopra e sperimentare con la selezione delle caselle di controllo. Lo stato istantaneo di entrambe le caselle di controllo viene visualizzato in basso.

Evento Jython JList

Il controllo JList nel pacchetto swing fornisce all'utente un elenco scorrevole di elementi tra cui scegliere. Il JComboBox fornisce un elenco a discesa di elementi. In Java, l'evento di selezione viene elaborato implementando il metodo valueChanged () in ListSelectionListener. In Jython, un gestore di eventi viene assegnato alla proprietà valueChanged dell'oggetto JList.

Nell'esempio seguente, un oggetto JList e un'etichetta vengono aggiunti a un JFrame in BorderLayout. JList viene popolato con una raccolta di elementi in una tupla. La sua proprietà valueChanged è impostata sulla funzione listSelect ().

lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)

La funzione del gestore eventi ottiene l'indice dell'elemento selezionato e preleva l'elemento corrispondente dall'oggetto JList da visualizzare sull'etichetta in basso.

def listSelect(event):
   index = lst.selectedIndex
   lbl1.text = "Hello" + lang[index]

Gli oggetti JList e JLabel vengono aggiunti a JFrame utilizzando BorderLayout.

L'intero codice è dato di seguito -

from javax.swing import JFrame, JPanel, JLabel, JList
from java.awt import BorderLayout

frame = JFrame("JList Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(300,250)

frame.setLayout(BorderLayout())

def listSelect(event):
   index = lst.selectedIndex
   lbl1.text = "Hello" + lang[index]

lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)
lbl1 = JLabel("box1 not selected box2 not selected")
frame.add(lst, BorderLayout.NORTH)
frame.add(lbl1, BorderLayout.SOUTH)

frame.setVisible(True)

L'output del codice seguente è il seguente.