Jython - 事件处理


Java swing 中的事件处理要求将控件(如 JButton 或 JList 等)注册到相应的事件侦听器中。事件侦听器接口或相应的 Adapter 类需要实现或子类化,并覆盖其事件处理方法。在 Jython 中,事件处理非常简单。我们可以将任何函数作为与控件对应的事件处理函数的属性传递。

我们首先看看 Java 中如何处理 click 事件。

首先,我们必须导入 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 函数,它处理按钮上的 click 事件。


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' 消息。

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', Maths' 输入分数,然后单击 'Add' 按钮。结果将相应地显示。

物理数学

Jython JRadioButton 事件

JRadioButton 类在 javax.swing 包中定义。它创建一个具有 on 或 off 状态的可选切换按钮。如果在 ButtonGroup 中添加了多个单选按钮,则它们的选择是互斥的。

在以下示例中,将 JRadioButton 类的两个对象和两个 JLabel 添加到垂直 BoxLayout 中的 Jpanel 容器中。在 JRadioButton 对象的构造函数中,OnCheck() 函数被设置为 actionPerformed 属性的值。当单击单选按钮以更改其状态时,将执行此函数。

rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)

请注意,单选按钮的默认状态为 false(未选中)。按钮 rb1 的起始状态为 True (selected)。

将这两个单选按钮添加到单选按钮 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 对象中,该对象的 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 脚本并更改单选按钮选择。选择将显示在底部的标签中。

JRadioButton

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 像素的 spaceholder。


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)

运行上述代码并尝试选择复选框。两个复选框的瞬时状态都显示在底部。

Check Box

Jython JList 活动

swing 包中的 JList 控件为用户提供了一个可滚动的项列表以供选择。JComboBox 提供了一个项的下拉列表。在 Java 中,通过在 ListSelectionListener 中实现 valueChanged() 方法来处理选择事件。在 Jython 中,将事件处理程序分配给 JList 对象的 valueChanged 属性。

在下面的示例中,将 JList 对象和标签添加到 BorderLayout 中的 JFrame 中。JList 在 Tuples 中填充了一组项。它的 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)

以下代码的输出如下。

JList and JLabel Object