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

Java and 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”按钮。结果将相应显示。

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(选中)。

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

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 像素高的占位符。

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)

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

Check Box

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)

以下代码的输出如下。

JList and JLabel Object
广告