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。相反,任何用户定义的函数都可以直接提供给JButton构造函数,作为 actionPerformed 豆类属性的值。
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)
当从命令提示符下执行上述代码时,出现以下窗口。输入 “Phy”、”Maths “的分数,然后点击 “添加 “按钮。结果将相应显示出来。
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(选中)。
这两个单选按钮被添加到一个单选按钮组中,使它们相互排斥,这样如果一个被选中,另一个就自动取消选择。
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)
以下代码的输出情况如下。