Jython - การจัดการเหตุการณ์
การจัดการเหตุการณ์ใน Java swing ต้องการให้คอนโทรล (เช่น JButton หรือ JList เป็นต้น) ควรลงทะเบียนกับ event listener ตามลำดับ อินเทอร์เฟซตัวฟังเหตุการณ์หรือคลาสอะแด็ปเตอร์ที่เกี่ยวข้องจะต้องถูกนำไปใช้หรือคลาสย่อยโดยแทนที่เมธอดการจัดการเหตุการณ์ ใน Jython การจัดการเหตุการณ์นั้นง่ายมาก เราสามารถส่งผ่านฟังก์ชันใด ๆ ที่เป็นคุณสมบัติของฟังก์ชันการจัดการเหตุการณ์ที่สอดคล้องกับการควบคุม
ก่อนอื่นให้เรามาดูกันว่าเหตุการณ์การคลิกถูกจัดการใน Java อย่างไร
ในการเริ่มต้นเราต้องนำเข้าไฟล์ java.awt.event package. ถัดไปคลาสที่ขยาย JFrame ต้องใช้อินเทอร์เฟซ ActionListener
public class btnclick extends JFrame implements ActionListener
จากนั้นเราต้องประกาศวัตถุ JButton เพิ่มลงใน ContentPane ของเฟรมจากนั้นจึงลงทะเบียนกับ ActionListener โดยวิธี addActionListener ()
JButton b1 = new JButton("Click here");
getContentPane().add(b1);
b1.addActionListener(this);
ตอนนี้เมธอด actionPerformed () ของอินเทอร์เฟซ ActionListener ต้องถูกแทนที่เพื่อจัดการ 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 ต่อไปนี้วัตถุ JTextField สองตัวถูกจัดเตรียมไว้บนหน้าต่าง JFrame เพื่อป้อนเครื่องหมายใน '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 package. จะสร้างปุ่มสลับที่เลือกได้โดยมีสถานะเปิดหรือปิด หากมีการเพิ่มปุ่มตัวเลือกหลายปุ่มใน ButtonGroup การเลือกปุ่มเหล่านั้นจะไม่สามารถใช้ร่วมกันได้
ในตัวอย่างต่อไปนี้ออบเจ็กต์สองรายการของคลาส JRadioButton และ JLabels สองรายการจะถูกเพิ่มลงในคอนเทนเนอร์ Jpanel ใน BoxLayout แนวตั้ง ในตัวสร้างของวัตถุ JRadioButton ไฟล์OnCheck()ฟังก์ชันถูกตั้งค่าเป็นค่าของคุณสมบัติ actionPerformed ฟังก์ชันนี้จะทำงานเมื่อมีการคลิกปุ่มตัวเลือกเพื่อเปลี่ยนสถานะ
rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)
โปรดทราบว่าสถานะเริ่มต้นของ Radio Button เป็นเท็จ (ไม่ได้เลือก) ปุ่ม rb1 ถูกสร้างขึ้นโดยมีสถานะเริ่มต้นเป็น True (เลือก)
ปุ่มตัวเลือกสองปุ่มจะถูกเพิ่มลงในกลุ่มวิทยุ ButtonGroup เพื่อทำให้ปุ่มเหล่านี้ใช้งานได้โดยเฉพาะดังนั้นหากมีการเลือกปุ่มอื่นปุ่มอื่นจะถูกยกเลิกโดยอัตโนมัติ
grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)
ปุ่มตัวเลือกสองปุ่มนี้พร้อมกับป้ายกำกับสองปุ่มจะถูกเพิ่มลงในวัตถุแผงในเค้าโครงแนวตั้งโดยมีพื้นที่คั่น 25 พิกเซลที่มีความสูงระหว่าง rb2 และ lbl2
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 ยังเป็นปุ่มที่เลือกได้โดยมีช่องทำเครื่องหมายสี่เหลี่ยมนอกเหนือจากคำอธิบายภาพ โดยทั่วไปจะใช้เพื่อให้ผู้ใช้มีโอกาสเลือกหลายตัวเลือกจากรายการสิ่งของ
ในตัวอย่างต่อไปนี้กล่องกาเครื่องหมายสองช่องและป้ายชื่อจากแพ็กเกจสวิงจะถูกเพิ่มไปยัง 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 จะถูกเพิ่มไปยัง 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 ระดับบนสุดซึ่งคุณสมบัติที่มองเห็นได้ถูกตั้งค่าเป็นจริงในตอนท้าย
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 เหตุการณ์
การควบคุม JList ในแพ็กเกจการแกว่งให้ผู้ใช้มีรายการที่เลื่อนได้เพื่อเลือก JComboBox แสดงรายการแบบหล่นลง ใน Java เหตุการณ์การเลือกถูกประมวลผลโดยใช้เมธอด valueChanged () ใน ListSelectionListener ใน Jython ตัวจัดการเหตุการณ์ถูกกำหนดให้กับคุณสมบัติ valueChanged ของวัตถุ JList
ในตัวอย่างต่อไปนี้อ็อบเจ็กต์ JList และเลเบลถูกเพิ่มลงใน JFrame ใน BorderLayout 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 ถูกเพิ่มใน JFrame โดยใช้ BorderLayout
รหัสทั้งหมดได้รับด้านล่าง -
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)
ผลลัพธ์ของรหัสต่อไปนี้มีดังนี้