Учебники

Jython — обработка событий

Для обработки событий в Java swing требуется, чтобы элемент управления (например, JButton, JList и т. Д.) Был зарегистрирован соответствующим слушателем событий. Интерфейс прослушивателя событий или соответствующий класс Adapter должен быть реализован или переклассифицирован с переопределенным методом обработки событий. В Jython обработка событий очень проста. Мы можем передать любую функцию как свойство функции обработки события, соответствующей элементу управления.

Давайте сначала посмотрим, как обрабатывается событие click в Java.

Для начала нам нужно импортировать пакет java.awt.event . Затем расширяющий класс JFrame должен реализовывать интерфейс ActionListener.

public class btnclick extends JFrame implements ActionListener

Затем мы должны объявить объект JButton, добавить его в ContentPane фрейма и затем зарегистрировать его в ActionListener методом addActionListener ().

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

Теперь метод actionPerformed () интерфейса ActionListener должен быть переопределен для обработки ActionEvent.

Ниже приводится весь код 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);
   }
}

Теперь мы напишем код Jython, эквивалентный тому же коду.

Для начала нам не нужно импортировать ActionEvent или ActionListener, поскольку динамическая типизация Jython позволяет нам не упоминать эти классы в нашем коде.

Во-вторых, нет необходимости реализовывать или создавать подкласс ActionListener. Вместо этого любая пользовательская функция сразу предоставляется конструктору JButton в качестве значения свойства bean-компонента actionPerformed .

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

Функция clickhere () определяется как обычная функция Jython, которая обрабатывает событие нажатия кнопки.

def change_text(event):
print clicked!'

Вот эквивалентный код 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)

Вывод кода Java и Jython идентичен. Когда кнопка нажата, она напечатает сообщение «нажал» на консоли.

Java и Jython

В следующем коде Jython в окне JFrame предусмотрены два объекта JTextField для ввода меток в «phy» и «maths». Объект JButton выполняет функцию add () при нажатии.

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

Функция add () считывает содержимое двух текстовых полей методом getText () и анализирует их в целые числа, чтобы можно было выполнить сложение. Затем результат помещается в третье текстовое поле методом setText ().

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

Полный код приведен ниже —

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)

Когда приведенный выше код выполняется из командной строки, появляется следующее окно. Введите оценки для «Phy», «Математика» и нажмите кнопку «Добавить». Результат будет отображаться соответственно.

Phy Maths

Jython JRadioButton Event

Класс JRadioButton определяется в пакете javax.swing . Он создает переключаемую кнопку с включенным или выключенным состояниями. Если в ButtonGroup добавлено несколько переключателей, их выбор является взаимоисключающим.

В следующем примере два объекта класса JRadioButton и два JLabels добавляются в контейнер Jpanel в вертикальном BoxLayout. В конструкторе объектов JRadioButton функция OnCheck () задается в качестве значения свойства actionPerformed. Эта функция выполняется при нажатии переключателя, чтобы изменить его состояние.

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

Обратите внимание, что для Radio Button по умолчанию установлено значение false (не выбрано). Кнопка rb1 создается с ее начальным состоянием как True (выбрано).

Две радиокнопки добавляются в радиокнопку ButtonGroup, чтобы сделать их взаимоисключающими, так что если одна из них выбрана, другая автоматически отменяется.

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

Эти две радиокнопки вместе с двумя метками добавляются к объекту панели в вертикальной компоновке с областью разделителя 25 пикселей по высоте между rb2 и 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)

Эта панель добавляется к объекту JFrame верхнего уровня, в конце которого свойство visible имеет значение True.

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)

Запустите приведенный выше скрипт Jython и измените выбор переключателей. Выбор появится на ярлыке внизу.

JRadioButton

Jython JCheckBox Event

Как и JRadioButton , объект JCheckBox также является выбираемой кнопкой с прямоугольным флажком, помимо заголовка. Это обычно используется, чтобы предоставить пользователю возможность выбрать несколько вариантов из списка элементов.

В следующем примере два флажка и метка из пакета свинга добавляются в JPanel в вертикальном BoxLayout. Метка внизу отображает мгновенное состояние выбора двух флажков.

Оба флажка объявлены с конструктором, имеющим свойство actionPerformed, установленное в функцию OnCheck () .

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

Функция OnCheck () проверяет состояние выбора каждого флажка и отображает соответствующее сообщение на ярлыке внизу.

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"

Эти поля и объект JLabel добавляются в JPanel, между ними добавляется пробел размером 50 пикселей.

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)

Сама панель добавляется в окно JFrame верхнего уровня, в конце которого свойство visible имеет значение true.

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

frame.setVisible(True)

Запустите приведенный выше код и поэкспериментируйте с выбором флажков. Мгновенное состояние обоих флажков отображается внизу.

Флажок

Jython JList Event

Элемент управления JList в свинг-пакете предоставляет пользователю список элементов с возможностью прокрутки. JComboBox предоставляет выпадающий список элементов. В Java событие выбора обрабатывается путем реализации метода valueChanged () в ListSelectionListener. В Jython обработчик событий назначается свойству valueChanged объекта JList.

В следующем примере объект JList и метка добавляются в JFrame в BorderLayout. JList заполнен коллекцией элементов в кортеже. Его свойство valueChanged установлено в функцию listSelect ().

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

Функция обработчика событий получает индекс выбранного элемента и извлекает соответствующий элемент из объекта JList для отображения на метке внизу.

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

Объекты JList и JLabel добавляются в JFrame с помощью BorderLayout.

Весь код приведен ниже —

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)

Вывод следующего кода выглядит следующим образом.