Jython - Xử lý sự kiện

Xử lý sự kiện trong Java swing yêu cầu điều khiển (như JButton hoặc JList, v.v.) phải được đăng ký với trình nghe sự kiện tương ứng. Giao diện trình xử lý sự kiện hoặc lớp Bộ điều hợp tương ứng cần được triển khai hoặc phân lớp với phương thức xử lý sự kiện của nó được ghi đè. Trong Jython, việc xử lý sự kiện rất đơn giản. Chúng ta có thể chuyển bất kỳ hàm nào làm thuộc tính của hàm xử lý sự kiện tương ứng với điều khiển.

Đầu tiên chúng ta hãy xem cách một sự kiện nhấp chuột được xử lý trong Java.

Để bắt đầu, chúng ta phải nhập java.awt.event package. Tiếp theo, lớp mở rộng JFrame phải triển khai giao diện ActionListener.

public class btnclick extends JFrame implements ActionListener

Sau đó, chúng ta phải khai báo đối tượng JButton, thêm nó vào khung ContentPane và sau đó đăng ký nó với ActionListener bằng phương thức addActionListener ().

JButton b1 = new JButton("Click here");
   getContentPane().add(b1);
   b1.addActionListener(this);

Bây giờ, phương thức actionPerformed () của giao diện ActionListener phải được ghi đè để xử lý ActionEvent.

Sau đây là toàn bộ mã 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);
   }
}

Bây giờ, chúng ta sẽ viết mã Jython tương đương với mã tương tự.

Để bắt đầu, chúng ta không cần nhập ActionEvent hoặc ActionListener, vì kiểu gõ động của Jython cho phép chúng ta tránh đề cập đến các lớp này trong mã của mình.

Thứ hai, không cần phải triển khai hoặc phân lớp ActionListener. Thay vào đó, bất kỳ hàm nào do người dùng xác định đều được cung cấp ngay lập tức cho hàm tạo JButton dưới dạng giá trị củaactionPerformed tính chất đậu.

button = JButton('Click here!', actionPerformed = clickhere)

Các clickhere() hàm được định nghĩa là một hàm Jython thông thường, hàm này xử lý sự kiện bấm vào nút.

def change_text(event):
print clicked!'

Đây là mã tương đương 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)

Đầu ra của mã Java và mã Jython giống hệt nhau. Khi nút được nhấp, nó sẽ in thông báo 'đã nhấp' trên bảng điều khiển.

Trong đoạn mã Jython sau, hai đối tượng JTextField được cung cấp trên cửa sổ JFrame để nhập dấu trong 'phy' và 'maths'. Đối tượng JButton thực thi hàm add () khi được nhấp vào.

btn = JButton("Add", actionPerformed = add)

Hàm add () đọc nội dung của hai trường văn bản bằng phương thức getText () và phân tích cú pháp chúng thành các số nguyên để có thể thực hiện phép cộng. Sau đó, kết quả được đưa vào trường văn bản thứ ba bằng phương thức setText ().

def add(event):
   print "add"
   ttl = int(txt1.getText())+int(txt2.getText())
   txt3.setText(str(ttl))

Mã hoàn chỉnh được cung cấp bên dưới -

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)

Khi đoạn mã trên được thực thi từ dấu nhắc lệnh, cửa sổ sau sẽ xuất hiện. Nhập điểm cho 'Phy', Maths, và nhấp vào nút 'Thêm'. Kết quả sẽ được hiển thị tương ứng.

Sự kiện Jython JRadioButton

Lớp JRadioButton được định nghĩa trong javax.swing package. Nó tạo ra một nút chuyển đổi có thể lựa chọn với các trạng thái bật hoặc tắt. Nếu nhiều nút radio được thêm vào một Nhóm nút, lựa chọn của chúng là loại trừ lẫn nhau.

Trong ví dụ sau, hai đối tượng của lớp JRadioButton và hai JLabels được thêm vào vùng chứa Jpanel trong BoxLayout dọc. Trong hàm tạo của các đối tượng JRadioButton,OnCheck()hàm được đặt làm giá trị của thuộc tính actionPerformed. Chức năng này được thực hiện khi nút radio được nhấp để thay đổi trạng thái của nó.

rb1 = JRadioButton("Male", True,actionPerformed = OnCheck)
rb2 = JRadioButton("Female", actionPerformed = OnCheck)

Lưu ý rằng trạng thái mặc định của Radio Button là false (không được chọn). Nút rb1 được tạo với trạng thái bắt đầu là True (đã chọn).

Hai nút radio được thêm vào một Nhóm nút radio để làm cho chúng loại trừ lẫn nhau, để nếu một nút được chọn, nút kia sẽ tự động được bỏ chọn.

grp = ButtonGroup()
grp.add(rb1)
grp.add(rb2)

Hai nút radio này cùng với hai nhãn được thêm vào một đối tượng bảng điều khiển trong bố cục dọc với vùng phân cách 25 pixel có chiều cao giữa rb2 và 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)

Bảng điều khiển này được thêm vào đối tượng JFrame cấp cao nhất, cuối cùng thuộc tính hiển thị được đặt thành 'Đúng'.

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)

Chạy tập lệnh Jython ở trên và thay đổi lựa chọn nút radio. Lựa chọn sẽ xuất hiện trong nhãn ở dưới cùng.

Sự kiện Jython JCheckBox

Giống như JRadioButton, Đối tượng JCheckBox cũng là một nút có thể chọn với hộp kiểm hình chữ nhật bên cạnh chú thích của nó. Điều này thường được sử dụng để cung cấp cho người dùng cơ hội chọn nhiều tùy chọn từ danh sách các mục.

Trong ví dụ sau, hai hộp kiểm và nhãn từ gói swing được thêm vào JPanel trong BoxLayout dọc. Nhãn ở dưới cùng hiển thị trạng thái lựa chọn tức thời của hai hộp kiểm.

Cả hai hộp kiểm đều được khai báo với hàm tạo có thuộc tính actionPerformed được đặt thành OnCheck() chức năng.

box1 = JCheckBox("Check1", actionPerformed = OnCheck)
box2 = JCheckBox("Check2", actionPerformed = OnCheck)

Hàm OnCheck () xác minh trạng thái lựa chọn của từng hộp kiểm và hiển thị thông báo tương ứng trên nhãn ở dưới cùng.

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"

Các hộp này và một đối tượng JLabel được thêm vào JPanel với khoảng trắng có chiều cao 50 pixel được thêm vào giữa chúng.

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)

Bản thân bảng điều khiển được thêm vào cửa sổ JFrame cấp cao nhất, cuối cùng thuộc tính hiển thị được đặt thành 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)

Chạy đoạn mã trên và thử nghiệm với việc lựa chọn các hộp kiểm. Trạng thái tức thời của cả hai hộp kiểm được hiển thị ở dưới cùng.

Sự kiện Jython JList

Điều khiển JList trong gói swing cung cấp cho người dùng một danh sách các mục có thể cuộn để chọn. JComboBox cung cấp danh sách các mục thả xuống. Trong Java, sự kiện lựa chọn được xử lý bằng cách triển khai phương thức valueChanged () trong ListSelectionListener. Trong Jython, một trình xử lý sự kiện được gán cho thuộc tính valueChanged của đối tượng JList.

Trong ví dụ sau, một đối tượng JList và một nhãn được thêm vào JFrame trong BorderLayout. JList chứa một bộ sưu tập các mục trong một bộ. Thuộc tính valueChanged của nó được đặt thành hàm listSelect ().

lang = ("C", "C++", "Java", "Python", "Perl", "C#", "VB", "PHP", "Javascript", "Ruby")
lst = JList(lang, valueChanged = listSelect)

Hàm xử lý sự kiện lấy chỉ mục của mục đã chọn và tìm nạp mục tương ứng từ đối tượng JList sẽ được hiển thị trên nhãn ở phía dưới.

def listSelect(event):
   index = lst.selectedIndex
   lbl1.text = "Hello" + lang[index]

Đối tượng JList và JLabel được thêm vào JFrame bằng cách sử dụng BorderLayout.

Toàn bộ mã được đưa ra bên dưới -

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)

Đầu ra của đoạn mã sau như sau.