Для обработки событий в 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 идентичен. Когда кнопка нажата, она напечатает сообщение «нажал» на консоли.
В следующем коде 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», «Математика» и нажмите кнопку «Добавить». Результат будет отображаться соответственно.
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 и измените выбор переключателей. Выбор появится на ярлыке внизу.
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)
Вывод следующего кода выглядит следующим образом.