Jython - tratamento de eventos

O tratamento de eventos no Java swing requer que o controle (como JButton ou JList etc.) seja registrado com o respectivo ouvinte de evento. A interface do ouvinte de evento ou a classe Adaptador correspondente precisa ser implementada ou subclassificada com seu método de manipulação de eventos substituído. Em Jython, o tratamento de eventos é muito simples. Podemos passar qualquer função como propriedade da função de tratamento de eventos correspondente ao controle.

Vamos primeiro ver como um evento de clique é tratado em Java.

Para começar, temos que importar o java.awt.event package. Em seguida, a classe que estende JFrame deve implementar a interface ActionListener.

public class btnclick extends JFrame implements ActionListener

Então, temos que declarar o objeto JButton, adicioná-lo ao ContentPane do frame e então registrá-lo com ActionListener pelo método addActionListener ().

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

Agora, o método actionPerformed () da interface ActionListener deve ser substituído para lidar com o ActionEvent.

A seguir está todo o código 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);
   }
}

Agora, vamos escrever o código Jython equivalente ao mesmo código.

Para começar, não precisamos importar o ActionEvent ou o ActionListener, pois a tipagem dinâmica do Jython nos permite evitar a menção dessas classes em nosso código.

Em segundo lugar, não há necessidade de implementar ou criar uma subclasse de ActionListener. Em vez disso, qualquer função definida pelo usuário é fornecida imediatamente ao construtor JButton como um valor deactionPerformed propriedade do feijão.

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

o clickhere() function é definida como uma função Jython regular, que trata do evento click no botão.

def change_text(event):
print clicked!'

Aqui está o código equivalente do 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)

A saída do código Java e Jython é idêntica. Quando o botão for clicado, ele imprimirá a mensagem 'clicado' no console.

No código Jython a seguir, dois objetos JTextField são fornecidos na janela JFrame para inserir marcas em 'phy' e 'maths'. O objeto JButton executa a função add () quando clicado.

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

A função add () lê o conteúdo de dois campos de texto pelo método getText () e os analisa em inteiros, para que a adição possa ser realizada. O resultado é então colocado no terceiro campo de texto pelo método setText ().

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

O código completo é fornecido abaixo -

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 o código acima é executado a partir do prompt de comando, a seguinte janela é exibida. Digite as notas para 'Phy', Maths 'e clique no botão' Add '. O resultado será exibido de acordo.

Evento Jython JRadioButton

A classe JRadioButton é definida no javax.swing package. Ele cria um botão de alternância selecionável com os estados ativado ou desativado. Se vários botões de opção forem adicionados a um ButtonGroup, sua seleção será mutuamente exclusiva.

No exemplo a seguir, dois objetos da classe JRadioButton e dois JLabels são adicionados a um contêiner Jpanel em um BoxLayout vertical. No construtor dos objetos JRadioButton, oOnCheck()função é definida como o valor da propriedade actionPerformed. Esta função é executada quando o botão de rádio é clicado para alterar seu estado.

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

Observe que o estado padrão do botão de rádio é falso (não selecionado). O botão rb1 é criado com seu estado inicial como True (selecionado).

Os dois botões de opção são adicionados a um ButtonGroup de rádio para torná-los mutuamente exclusivos, de forma que se um for selecionado, o outro será desmarcado automaticamente.

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

Esses dois botões de opção junto com dois rótulos são adicionados a um objeto de painel no layout vertical com uma área separadora de 25 pixels em alturas entre 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)

Este painel é adicionado a um objeto JFrame de nível superior, cuja propriedade visible é definida como 'True' no 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)

Execute o script Jython acima e altere a seleção do botão de rádio. A seleção aparecerá na etiqueta na parte inferior.

Evento Jython JCheckBox

Como o JRadioButton, O objeto JCheckBox também é um botão selecionável com uma caixa de seleção retangular ao lado de sua legenda. Isso geralmente é usado para fornecer ao usuário a oportunidade de selecionar várias opções na lista de itens.

No exemplo a seguir, duas caixas de seleção e um rótulo do pacote swing são adicionados a um JPanel no BoxLayout vertical. O rótulo na parte inferior exibe o estado de seleção instantânea de duas caixas de seleção.

Ambas as caixas de seleção são declaradas com o construtor tendo a propriedade actionPerformed definida para o OnCheck() função.

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

A função OnCheck () verifica o estado de seleção de cada caixa de seleção e exibe a mensagem correspondente na etiqueta na 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"

Essas caixas e um objeto JLabel são adicionados a um JPanel com um espaço reservado de 50 pixels de altura adicionado entre eles.

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)

O próprio painel é adicionado a uma janela JFrame de nível superior, cuja propriedade visible é definida como true no 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)

Execute o código acima e experimente selecionar as caixas de seleção. O estado instantâneo de ambas as caixas de seleção é exibido na parte inferior.

Evento Jython JList

O controle JList no pacote swing fornece ao usuário uma lista rolável de itens para escolher. O JComboBox fornece uma lista suspensa de itens. Em Java, o evento de seleção é processado implementando o método valueChanged () no ListSelectionListener. Em Jython, um manipulador de eventos é atribuído à propriedade valueChanged do objeto JList.

No exemplo a seguir, um objeto JList e um rótulo são adicionados a um JFrame no BorderLayout. O JList é preenchido com uma coleção de itens em uma tupla. Sua propriedade valueChanged é definida para a função listSelect ().

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

A função de manipulador de eventos obtém o índice do item selecionado e busca o item correspondente do objeto JList a ser exibido no rótulo na parte inferior.

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

O objeto JList e JLabel são adicionados ao JFrame usando BorderLayout.

Todo o código é fornecido abaixo -

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)

A saída do código a seguir é a seguinte.