开发手册 欢迎您!
软件开发者资料库

Jython - 事件处理

Jython事件处理 - 从简单和简单的步骤学习Jython,从基本到高级概念,包括概述,安装,导入Java库,变量和数据类型,使用Java集合类型,决策控制,循环,函数,模块,包,Java应用程序,Eclipse插件,Eclipse中的项目,NetBeans插件和项目,Servlet,JDBC,使用Swing GUI库,布局管理,事件处理,菜单,对话框。

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

让我们首先看看如何用Java处理click事件.

首先,我们必须导入 java.awt.event包.接下来,扩展JFrame的类必须实现ActionListener接口.

public class btnclick extends JFrame implements ActionListener

然后,我们必须声明JButton对象,将其添加到frame的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函数,它处理按钮上的click事件.

def change_text(event):print clicked!'

这是Jython等效代码.

from javax.swing import JFrame, JButtonframe = 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代码是完全相同的.单击该按钮时,它将在控制台上打印"单击"消息.

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, JTextFieldfrom java.awt import Dimensionframe = 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"的标记,然后单击"添加"按钮.结果将相应显示.

Phy Maths

Jython JRadioButton事件

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

在下面的示例中,JRadioButton类的两个对象和两个JLabel被添加到垂直的Jpanel容器中BoxLayout的.在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, Boxfrom java.awt import Dimensionfrom javax.swing import JRadioButton,ButtonGroupframe = 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包中的标签被添加到垂直JPanel中BoxLayout的.底部的标签显示两个复选框的瞬时选择状态.

两个复选框都是使用构造函数声明的,其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对象被添加到J中面板之间添加了一个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]

使用BorderLayout将JList和JLabel对象添加到JFrame.

整个代码在下面和下面给出;

from javax.swing import JFrame, JPanel, JLabel, JListfrom java.awt import BorderLayoutframe = 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和JLabel对象