Jython - обработка событий
Обработка событий в Java Swing требует, чтобы элемент управления (например, JButton или JList и т. Д.) Был зарегистрирован в соответствующем прослушивателе событий. Интерфейс прослушивателя событий или соответствующий класс адаптера должен быть реализован или разделен на подклассы с переопределением его метода обработки событий. В Jython обработка событий очень проста. Мы можем передать любую функцию как свойство функции обработки событий, соответствующей элементу управления.
Давайте сначала посмотрим, как событие щелчка обрабатывается в Java.
Для начала нам нужно импортировать java.awt.event package. Затем класс, расширяющий 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 как значениеactionPerformed bean свойство.
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)
Когда приведенный выше код выполняется из командной строки, появляется следующее окно. Введите оценки за «Физика», «Математика» и нажмите кнопку «Добавить». Результат будет отображаться соответственно.
Событие Jython JRadioButton
Класс JRadioButton определен в javax.swing package. Он создает выбираемую кнопку-переключатель с включенным или выключенным состояниями. Если в ButtonGroup добавлено несколько переключателей, их выбор является взаимоисключающим.
В следующем примере два объекта класса JRadioButton и два объекта JLabel добавляются в контейнер Jpanel в вертикальном BoxLayout. В конструкторе объектов JRadioButtonOnCheck()функция устанавливается как значение свойства actionPerformed. Эта функция выполняется, когда щелкают по переключателю, чтобы изменить его состояние.
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
Обратите внимание, что состояние Radio Button по умолчанию - false (не выбрано). Кнопка rb1 создается с начальным состоянием True (выбрано).
Два переключателя добавляются в группу Radio 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
Словно JRadioButton, Объект JCheckBox также является выбираемой кнопкой с прямоугольным флажком помимо заголовка. Обычно это используется, чтобы предоставить пользователю возможность выбрать несколько вариантов из списка элементов.
В следующем примере два флажка и метка из пакета Swing добавляются к 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
Элемент управления JList в пакете swing предоставляет пользователю прокручиваемый список элементов для выбора. 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)
Вывод следующего кода выглядит следующим образом.