Jython 简明教程

Jython - Event Handling

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

让我们首先了解如何在 Java 中处理单击事件。

首先,我们必须导入 java.awt.event package 。接下来,扩展 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 bean 属性的值。

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

Jython JRadioButton Event

JRadioButton 类定义在 javax.swing package 中。它创建一个可选的带有开关状态的切换按钮。如果在 ButtonGroup 中添加了多个单选按钮,则它们的选取是互斥的。

在以下示例中,JRadioButton 类和两种 JLabel 被添加到使用垂直 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 对象,该对象的 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 Event

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)

运行上述代码并对复选框的选择进行实验。两个复选框的瞬时状态显示在底部。

check box

Jython JList Event

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