- Jython 教程
- Jython - 首頁
- Jython - 概述
- Jython - 安裝
- Jython - 匯入 Java 庫
- Jython - 變數和資料型別
- Jython - 使用 Java 集合型別
- Jython - 決策控制
- Jython - 迴圈
- Jython - 函式
- Jython - 模組
- Jython - 包
- Jython - Java 應用程式
- Jython - Eclipse 外掛
- Jython - Eclipse 中的專案
- Jython - NetBeans 外掛和專案
- Jython - Servlet
- Jython - JDBC
- Jython - 使用 Swing GUI 庫
- Jython - 佈局管理
- Jython - 事件處理
- Jython - 選單
- Jython - 對話方塊
- Jython 有用資源
- Jython - 快速指南
- Jython - 有用資源
- Jython - 討論
Jython - 事件處理
在 Java Swing 中,事件處理需要將控制元件(如 JButton 或 JList 等)註冊到相應的事件監聽器。需要實現事件監聽器介面或相應的介面卡類,並覆蓋其事件處理方法。在 Jython 中,事件處理非常簡單。我們可以將任何函式作為控制元件對應事件處理函式的屬性。
讓我們首先看看如何在 Java 中處理點選事件。
首先,我們必須匯入 **java.awt.event 包**。接下來,擴充套件 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。相反,任何使用者定義的函式都可以直接作為 **actionPerformed** bean 屬性的值提供給 JButton 建構函式。
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”訊息。
在下面的 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”的成績,然後單擊“Add”按鈕。結果將相應顯示。
Jython JRadioButton 事件
JRadioButton 類在 **javax.swing 包**中定義。它建立一個具有開或關狀態的可選擇的切換按鈕。如果在 ButtonGroup 中新增多個單選按鈕,則它們的選中是互斥的。
在下面的示例中,將 JRadioButton 類的兩個物件和兩個 JLabels 新增到垂直 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 物件,其可見屬性最終設定為“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 物件也是一個可選擇的按鈕,其標題旁邊有一個矩形的可選中框。這通常用於為使用者提供從專案列表中選擇多個選項的機會。
在下面的示例中,將兩個複選框和一個來自 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 視窗,其可見屬性最終設定為 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]
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)
以下程式碼的輸出如下。