- 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 或子类化 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 代码的输出是相同的。单击该按钮时,它将在控制台上打印“已单击”消息。
在以下 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 包中定义。它创建一个具有打开或关闭状态的可选切换按钮。如果在 ButtonGroup 中添加多个单选按钮,则它们的选择是互斥的。
在以下示例中,JRadioButton 类的两个对象和两个 JLabel 被添加到垂直 BoxLayout 中的 Jpanel 容器中。在 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)
这两个单选按钮和两个标签被添加到垂直布局中的面板对象中,分隔符区域的高度在 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)
以下代码的输出如下。
