Jython - 事件处理
Java swing 中的事件处理要求控件(如 JButton 或 JList 等)应向相应的事件侦听器注册。 事件侦听器接口或相应的适配器类需要实现或子类化,并覆盖其事件处理方法。 在 Jython 中,事件处理非常简单。 我们可以将任何函数作为控件对应的事件处理函数的属性传递。
让我们先看看 Java 是如何处理点击事件的。
首先,我们必须导入 java.awt.event 包。 接下来,扩展 JFrame 的类必须实现 ActionListener 接口。
public class btnclick extends JFrame implements ActionListener
然后,我们必须声明JButton 对象,将其添加到框架的ContentPane 中,然后通过addActionListener() 方法将其注册到ActionListener。
JButton b1 = new JButton("Click here"); getContentPane().add(b1); b1.addActionListener(this);
现在,必须重写 ActionListener 接口的 actionPerformed() 方法来处理 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。 相反,任何用户定义的函数都直接作为 actionPerformed bean 属性的值提供给 JButton 构造函数。
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 代码的输出是相同的。 单击按钮时,它会在控制台上打印"clicked"消息。
在下面的 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"、"Maths"的分数,然后单击"添加"按钮。 结果将相应地显示。
Jython JRadioButton 事件
JRadioButton 类在javax.swing 包 中定义。 它创建一个可选择的切换按钮,具有打开或关闭状态。 如果在 ButtonGroup 中添加多个单选按钮,则它们的选择是互斥的。
在下面的示例中,JRadioButton 类的两个对象和两个 JLabel 被添加到垂直 BoxLayout 中的 Jpanel 容器中。 在 JRadioButton 对象的构造函数中,OnCheck() 函数被设置为 actionPerformed 属性的值。 单击单选按钮以更改其状态时,将执行此功能。
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck) rb2 = JRadioButton("Female", actionPerformed = OnCheck)
请注意,单选按钮的默认状态为 false(未选中)。 创建按钮 rb1,其起始状态为 True(选中)。
这两个单选按钮被添加到一个单选 ButtonGroup 中,使它们互斥,这样如果一个被选中,另一个会自动取消选择。
grp = ButtonGroup() grp.add(rb1) grp.add(rb2)
这两个单选按钮和两个标签被添加到垂直布局的面板对象中,分隔区域在 rb2 和 lbl2 之间,高度为 25 像素。
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 对象,其可见属性最终设置为"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 包的标签被添加到垂直 BoxLayout 中的 JPanel。 底部标签显示两个复选框的选中状态。
两个复选框都是通过构造函数声明的,该构造函数的 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 事件
swing 包中的 JList 控件为用户提供了一个可供选择的可滚动项目列表。 JComboBox 提供了项目的下拉列表。 在 Java 中,选择事件是通过在 ListSelectionListener 中实现 valueChanged() 方法来处理的。 在 Jython 中,事件处理程序被分配给 JList 对象的 valueChanged 属性。
在下面的示例中,JList 对象和标签被添加到 BorderLayout 中的 JFrame。 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]
使用 BorderLayout 将 JList 和 JLabel 对象添加到 JFrame。
完整代码如下 −
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)
下面代码的输出结果如下。