- Jython 教程
- Jython - 首页
- Jython - 概述
- Jython - 安装
- Jython - 导入 Java 库
- Jython - 变量和数据类型
- Jython - 使用 Java 集合类型
- Jython - 决策控制
- Jython - 循环
- Jython - 函数
- Jython - 模块
- Jython - 包
- Jython - Java 应用程序
- Jython - Eclipse 插件
- Jython - Eclipse 中的项目
- Jython - NetBeans 插件和项目
- Jython - Servlet
- Jython - JDBC
- Jython - 使用 Swing GUI 库
- Jython - 布局管理
- Jython - 事件处理
- Jython - 菜单
- Jython - 对话框
- Jython 有用资源
- Jython - 快速指南
- Jython - 有用资源
- Jython - 讨论
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”的成绩,然后单击“Add”按钮。结果将相应显示。
Jython JRadioButton 事件
JRadioButton 类在 **javax.swing 包**中定义。它创建一个具有开或关状态的可选择的切换按钮。如果在 ButtonGroup 中添加多个单选按钮,则它们的选中是互斥的。
在下面的示例中,将 JRadioButton 类的两个对象和两个 JLabels 添加到垂直 BoxLayout 中的 Jpanel 容器中。在 JRadioButton 对象的构造函数中,**OnCheck()** 函数设置为 actionPerformed 属性的值。单击单选按钮以更改其状态时,将执行此函数。
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck) rb2 = JRadioButton("Female", actionPerformed = OnCheck)
请注意,单选按钮的默认状态为 false(未选中)。按钮 rb1 的起始状态设置为 True(选中)。
将这两个单选按钮添加到一个 radio 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 窗口,其可见属性最终设置为 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]
JList 和 JLabel 对象使用 BorderLayout 添加到 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)
以下代码的输出如下。