Java進階09 事件響應
在 GUI中,我們看到了如何用圖形樹來組織一個圖形介面。然而,這樣的圖形介面是靜態的。我們無法互動的對該介面進行操作。GUI的圖形元素需要增加 事件響應(event handling),才能得到一個動態的圖形化介面。
元素, 事件, 監聽器
我們在 GUI一文中提到了許多圖形元素。有一些事件(Event)可能發生在這些圖形元素上,比如:
- 點選按鈕
- 拖動捲軸
- 選擇選單
Java中的事件使用物件表示,比如ActionEvent。每個事件有作用的圖形物件,比如按鈕,捲軸,選單。
所謂互動的GUI,是指當上面事件發生時,會有相應的動作產生,比如:
- 改變顏色
- 改變視窗內容
- 彈出選單
每個動作都針對一個事件。我們將動作放在一個監聽器(ActionListener)中,然後讓監聽器監視(某個圖形物件)的事件。當事件發生時,監聽器中的動作隨之發生。
因此,一個響應式的GUI是圖形物件、事件物件、監聽物件三者互動的結果。我們已經知道了如何建立圖形物件。我們需要給圖形物件增加監聽器,並讓監聽器捕捉事件。
按鈕響應
下面實現一個響應式的按鈕。在點選按鈕之後,皮膚的顏色會改變,如下圖:
(這個例子改編自Core Java 2,Volume 1, Example 8-1)
import javax.swing.*;import java.awt.event.*;import java.awt.*;public class HelloWorldSwing { private static void createAndShowGUI() { JFrame frame = new JFrame("HelloWorld"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Pane's layout Container cp = frame.getContentPane(); cp.setLayout(new FlowLayout()); // add interactive panel to Content Pane cp.add(new ButtonPanel()); // show the window frame.pack(); frame.setVisible(true); } public static void main(String[] args) { Runnable tr = new Runnable() { public void run() { createAndShowGUI(); } }; javax.swing.SwingUtilities.invokeLater(tr); } }/** * JPanel with Event Handling */class ButtonPanel extends JPanel { public ButtonPanel() { JButton yellowButton = new JButton("Yellow"); JButton redButton = new JButton("Red"); this.add(yellowButton); this.add(redButton); /** * register ActionListeners */ ColorAction yellowAction = new ColorAction(Color.yellow); ColorAction redAction = new ColorAction(Color.red); yellowButton.addActionListener(yellowAction); redButton.addActionListener(redAction); } /** * ActionListener as an inner class */ private class ColorAction implements ActionListener { public ColorAction(Color c) { backgroundColor = c; } /** * Actions */ public void actionPerformed(ActionEvent event) { setBackground(backgroundColor); // outer object, JPanel method repaint(); } private Color backgroundColor; } }
上面,我們用一個內部類ColorAction來實施 ActionListener介面。這樣做是為了讓監聽器能更方便的呼叫圖形物件的成員,比如setBackground()方法。
ActionListener的 actionPerformed()方法必須被覆蓋。該方法包含了事件的 對應動作。該方法的引數為事件物件,即監聽 ActionEvent型別的 事件。ActionEvent是一個高層的類,Java會找到圖形物件(按鈕)會發生的典型事件(點選)作為 事件。
ColorAction生成的物件即為監聽器物件。
我們為兩個按鈕JButton新增了相應的監聽器物件。當有事件發生時,對應動作將隨之產生。
總結
ActionListener interface
ActionEvent class
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2674836/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java進階學習之事件響應Java事件
- Java-進階篇【網路程式設計】---09Java程式設計
- WPF進階技巧和實戰09-事件(2-多點觸控)事件
- 09-Python之路---函式進階Python函式
- Python進階09 動態型別Python型別
- cc.Node事件響應事件
- 網路安全事件應急響應事件
- 理解響應者和響應鏈如何處理事件事件
- React 進階(四)事件詳解React事件
- Vue 進階系列(一)之響應式原理及實現Vue
- Flutter事件響應原始碼分析Flutter事件原始碼
- 事件傳遞和響應鏈事件
- Flutter:如何響應觸控事件Flutter事件
- Flutter:如何響應互動事件?Flutter事件
- UIDatePicker事件不響應問題UI事件
- CSS進階09-定位體系差異分析CSS
- 能否手寫vue3響應式原理-面試進階Vue面試
- 記一次安全應急響應事件事件
- C#事件及響應方法概述C#事件
- iOS GestureRecognizer與UIResponder touch事件響應iOSUI事件
- 使用Java 9 Flow進行響應式程式設計Java程式設計
- java 09Java
- 【2019 前端進階之路】深入 Vue 響應式原理,從原始碼分析前端Vue原始碼
- Java進階06 容器Java
- Java 異常進階Java
- Java進階--Java動態代理Java
- 《Effective Java》--Java進階必備Java
- 記錄下:iOS事件的事件的傳遞和響應iOS事件
- UIResponder事件響應鏈學習筆記UI事件筆記
- 事件傳遞和響應者鏈條事件
- 記一次挖礦病毒應急響應事件事件
- Java小白進階筆記(5)-進階物件導向Java筆記物件
- java09Java
- 15Java進階 程式Java
- Java進階01 String類Java
- Java進階容器學習Java
- java進階(29)--HashMap集合JavaHashMap
- java進階(33)--IO流Java