Jython - Manejo de eventos
El manejo de eventos en Java swing requiere que el control (como JButton o JList, etc.) se registre con el detector de eventos respectivo. La interfaz de escucha de eventos o la clase de adaptador correspondiente debe implementarse o subclasificarse con su método de manejo de eventos anulado. En Jython, el manejo de eventos es muy simple. Podemos pasar cualquier función como propiedad de la función de manejo de eventos correspondiente al control.
Veamos primero cómo se maneja un evento de clic en Java.
Para empezar, tenemos que importar el java.awt.event package. A continuación, la clase que extiende JFrame debe implementar la interfaz ActionListener.
public class btnclick extends JFrame implements ActionListener
Luego, tenemos que declarar el objeto JButton, agregarlo al ContentPane del marco y luego registrarlo con ActionListener mediante el método addActionListener ().
JButton b1 = new JButton("Click here");
getContentPane().add(b1);
b1.addActionListener(this);
Ahora, el método actionPerformed () de la interfaz ActionListener debe anularse para manejar ActionEvent.
A continuación se muestra el código Java completo:
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);
}
}
Ahora, escribiremos el código Jython equivalente al mismo código.
Para empezar, no necesitamos importar ActionEvent o ActionListener, ya que la escritura dinámica de Jython nos permite evitar mencionar estas clases en nuestro código.
En segundo lugar, no es necesario implementar o crear una subclase de ActionListener. En cambio, cualquier función definida por el usuario se proporciona directamente al constructor JButton como un valor deactionPerformed propiedad de frijol.
button = JButton('Click here!', actionPerformed = clickhere)
los clickhere() La función se define como una función Jython normal, que maneja el evento de clic en el botón.
def change_text(event):
print clicked!'
Aquí está el código equivalente de 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)
La salida del código Java y Jython es idéntica. Cuando se hace clic en el botón, se imprimirá el mensaje de "clic" en la consola.
En el siguiente código de Jython, se proporcionan dos objetos JTextField en la ventana JFrame para ingresar marcas en 'phy' y 'maths'. El objeto JButton ejecuta la función add () cuando se hace clic en él.
btn = JButton("Add", actionPerformed = add)
La función add () lee el contenido de dos campos de texto mediante el método getText () y los analiza en números enteros, de modo que se pueda realizar la suma. El resultado se coloca en el tercer campo de texto mediante el método setText ().
def add(event):
print "add"
ttl = int(txt1.getText())+int(txt2.getText())
txt3.setText(str(ttl))
El código completo se proporciona a continuación:
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)
Cuando el código anterior se ejecuta desde el símbolo del sistema, aparece la siguiente ventana. Introduzca marcas para 'Phy', Maths 'y haga clic en el botón' Agregar '. El resultado se mostrará en consecuencia.
Evento Jython JRadioButton
La clase JRadioButton se define en el javax.swing package. Crea un botón de alternancia seleccionable con estados de encendido o apagado. Si se agregan varios botones de opción en un ButtonGroup, su selección es mutuamente excluyente.
En el siguiente ejemplo, dos objetos de la clase JRadioButton y dos JLabels se agregan a un contenedor Jpanel en un BoxLayout vertical. En el constructor de los objetos JRadioButton, elOnCheck()La función se establece como el valor de la propiedad actionPerformed. Esta función se ejecuta cuando se hace clic en el botón de opción para cambiar su estado.
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
Tenga en cuenta que el estado predeterminado del botón de opción es falso (no seleccionado). El botón rb1 se crea con su estado inicial como Verdadero (seleccionado).
Los dos botones de opción se agregan a un grupo de botones de opción para que sean mutuamente excluyentes, de modo que si se selecciona uno, el otro se deselecciona automáticamente.
grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)
Estos dos botones de radio junto con dos etiquetas se agregan a un objeto de panel en el diseño vertical con un área de separación de 25 píxeles en alturas entre rb2 y 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)
Este panel se agrega a un objeto JFrame de nivel superior, cuya propiedad visible se establece en 'Verdadero' al final.
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)
Ejecute el script Jython anterior y cambie la selección del botón de opción. La selección aparecerá en la etiqueta de la parte inferior.
Evento Jython JCheckBox
Como el JRadioButtonEl objeto JCheckBox también es un botón seleccionable con una casilla de verificación rectangular además de su título. Esto se usa generalmente para brindar al usuario la oportunidad de seleccionar múltiples opciones de la lista de elementos.
En el siguiente ejemplo, se agregan dos casillas de verificación y una etiqueta del paquete swing a un JPanel en BoxLayout vertical. La etiqueta en la parte inferior muestra el estado de selección instantáneo de dos casillas de verificación.
Ambas casillas de verificación se declaran con el constructor que tiene la propiedad actionPerformed establecida en el OnCheck() función.
box1 = JCheckBox("Check1", actionPerformed = OnCheck)
box2 = JCheckBox("Check2", actionPerformed = OnCheck)
La función OnCheck () verifica el estado de selección de cada casilla de verificación y muestra el mensaje correspondiente en la etiqueta en la parte inferior.
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"
Estos cuadros y un objeto JLabel se agregan a un JPanel con un marcador de espacio de 50 píxeles de altura agregado entre ellos.
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)
El panel en sí se agrega a una ventana JFrame de nivel superior, cuya propiedad visible se establece en verdadera al final.
frame = JFrame("JCheckBox Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,150)
frame.add(panel)
frame.setVisible(True)
Ejecute el código anterior y experimente con la selección de casillas de verificación. El estado instantáneo de ambas casillas de verificación se muestra en la parte inferior.
Evento JList de Jython
El control JList en el paquete swing proporciona al usuario una lista desplazable de elementos para elegir. JComboBox proporciona una lista desplegable de elementos. En Java, el evento de selección se procesa implementando el método valueChanged () en ListSelectionListener. En Jython, se asigna un controlador de eventos a la propiedad valueChanged del objeto JList.
En el siguiente ejemplo, un objeto JList y una etiqueta se agregan a un JFrame en BorderLayout. JList se rellena con una colección de elementos en una tupla. Su propiedad valueChanged se establece en la función listSelect ().
lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)
La función del controlador de eventos obtiene el índice del elemento seleccionado y recupera el elemento correspondiente del objeto JList para mostrarlo en la etiqueta en la parte inferior.
def listSelect(event):
index = lst.selectedIndex
lbl1.text = "Hello" + lang[index]
El objeto JList y JLabel se agregan al JFrame usando BorderLayout.
El código completo se da a continuación:
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)
El resultado del siguiente código es el siguiente.