Jython - Penanganan Acara

Penanganan event di Java swing membutuhkan kontrol (seperti JButton atau JList dll.) Harus didaftarkan dengan event listener masing-masing. Antarmuka pemroses kejadian atau kelas Adaptor terkait perlu diimplementasikan atau disubkelas dengan mengganti metode penanganan kejadiannya. Di Jython, penanganan acara sangat sederhana. Kita bisa melewatkan fungsi apapun sebagai properti fungsi penanganan event yang sesuai dengan kontrol.

Mari kita lihat bagaimana event klik ditangani di Java.

Untuk memulai, kita harus mengimpor file java.awt.event package. Selanjutnya, kelas yang memperluas JFrame harus mengimplementasikan antarmuka ActionListener.

public class btnclick extends JFrame implements ActionListener

Kemudian, kita harus mendeklarasikan objek JButton, menambahkannya ke bingkai ContentPane dan kemudian mendaftarkannya dengan ActionListener dengan metode addActionListener ().

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

Sekarang, metode actionPerformed () dari antarmuka ActionListener harus diganti untuk menangani ActionEvent.

Berikut ini adalah seluruh kode 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);
   }
}

Sekarang, kita akan menulis kode Jython yang setara dengan kode yang sama.

Untuk memulainya, kita tidak perlu mengimpor ActionEvent atau ActionListener, karena pengetikan dinamis Jython memungkinkan kita untuk menghindari penyebutan kelas-kelas ini dalam kode kita.

Kedua, tidak perlu mengimplementasikan atau membuat subclass ActionListener. Sebaliknya, setiap fungsi yang ditentukan pengguna langsung diberikan ke konstruktor JButton sebagai nilaiactionPerformed properti kacang.

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

Itu clickhere() Fungsi didefinisikan sebagai fungsi Jython biasa, yang menangani peristiwa klik pada tombol.

def change_text(event):
print clicked!'

Berikut adalah kode setara 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)

Output kode Java dan Jython identik. Ketika tombol diklik, itu akan mencetak pesan 'diklik' di konsol.

Dalam kode Jython berikut, dua objek JTextField disediakan di jendela JFrame untuk memasukkan tanda di 'phy' dan 'maths'. Objek JButton menjalankan fungsi add () saat diklik.

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

Fungsi add () membaca konten dari dua bidang teks dengan metode getText () dan menguraikannya menjadi bilangan bulat, sehingga penambahan dapat dilakukan. Hasilnya kemudian diletakkan di bidang teks ketiga dengan metode setText ().

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

Kode lengkap diberikan di bawah ini -

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)

Ketika kode di atas dijalankan dari command prompt, jendela berikut akan muncul. Masukkan tanda untuk 'Phy', Matematika ', dan klik tombol' Add '. Hasilnya akan ditampilkan sesuai.

Acara Jython JRadioButton

Kelas JRadioButton didefinisikan di javax.swing package. Ini menciptakan tombol sakelar yang dapat dipilih dengan status hidup atau mati. Jika beberapa tombol radio ditambahkan dalam Grup Tombol, pilihannya eksklusif satu sama lain.

Dalam contoh berikut, dua objek kelas JRadioButton dan dua JLabel ditambahkan ke wadah Jpanel dalam BoxLayout vertikal. Dalam konstruktor objek JRadioButton, fileOnCheck()function ditetapkan sebagai nilai properti actionPerformed. Fungsi ini dijalankan ketika tombol radio diklik untuk mengubah statusnya.

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

Perhatikan bahwa status default Radio Button adalah false (tidak dipilih). Tombol rb1 dibuat dengan status awalnya sebagai True (dipilih).

Kedua tombol radio ditambahkan ke Radio ButtonGroup untuk membuatnya saling eksklusif, sehingga jika satu dipilih, yang lain batal dipilih secara otomatis.

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

Kedua tombol radio ini bersama dengan dua label ditambahkan ke objek panel dalam tata letak vertikal dengan area pemisah 25 piksel dalam ketinggian antara rb2 dan 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)

Panel ini ditambahkan ke objek JFrame level atas, yang properti terlihatnya disetel ke 'True' pada akhirnya.

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)

Jalankan skrip Jython di atas dan ubah pilihan tombol radio. Pilihan akan muncul di label di bagian bawah.

Acara Jython JCheckBox

Seperti JRadioButton, Objek JCheckBox juga merupakan tombol yang dapat dipilih dengan kotak persegi panjang di samping judulnya. Ini biasanya digunakan untuk memberikan kesempatan kepada pengguna untuk memilih beberapa opsi dari daftar item.

Dalam contoh berikut, dua kotak centang dan label dari paket ayunan ditambahkan ke JPanel dalam BoxLayout vertikal. Label di bagian bawah menampilkan status pemilihan seketika dari dua kotak centang.

Kedua kotak centang dideklarasikan dengan konstruktor yang memiliki properti actionPerformed disetel ke OnCheck() fungsi.

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

Fungsi OnCheck () memverifikasi status pemilihan setiap kotak centang dan menampilkan pesan terkait pada label di bagian bawah.

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"

Kotak-kotak ini dan objek JLabel ditambahkan ke JPanel dengan spasi 50 piksel yang ditambahkan di antaranya.

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)

Panel itu sendiri ditambahkan ke jendela JFrame tingkat atas, yang properti terlihatnya disetel ke true pada akhirnya.

frame = JFrame("JCheckBox Example")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setLocation(100,100)
frame.setSize(250,150)
frame.add(panel)

frame.setVisible(True)

Jalankan kode di atas dan lakukan percobaan dengan memilih kotak centang. Status seketika dari kedua kotak centang ditampilkan di bagian bawah.

Acara Jython JList

Kontrol JList dalam paket swing memberi pengguna daftar item yang dapat digulir untuk dipilih. JComboBox menyediakan daftar drop-down item. Di Java, acara pemilihan diproses dengan mengimplementasikan metode valueChanged () di ListSelectionListener. Di Jython, penanganan kejadian ditugaskan ke properti valueChanged dari objek JList.

Dalam contoh berikut, objek JList dan label ditambahkan ke JFrame di BorderLayout. JList diisi dengan kumpulan item dalam tupel. Properti valueChangednya disetel ke fungsi listSelect ().

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

Fungsi event handler memperoleh indeks dari item yang dipilih dan mengambil item yang sesuai dari objek JList untuk ditampilkan pada label di bagian bawah.

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

Objek JList dan JLabel ditambahkan ke JFrame menggunakan BorderLayout.

Seluruh kode diberikan di bawah ini -

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)

Output dari kode berikut adalah sebagai berikut.