Swing中的事件是用戶采取的動作。 例如,按下按鈕,在鍵盤上向下/向上按下一個鍵。
事件的源是生成事件的組件。例如,當(dāng)我們按下一個JButton時,點擊的事件發(fā)生在那個JButton上。 在這種情況下,JButton是點擊事件的來源。
事件表示在源組件上發(fā)生的操作。
ActionListener接口有一個稱為actionPerformed()的方法。接口聲明如下:
public interface ActionListener extends EventListener { void actionPerformed(ActionEvent event); }
所有事件偵聽器接口都從java.util.EventListener接口繼承。
EventListener接口是一個標(biāo)記接口,它沒有任何方法。
當(dāng)按下JButton時,將調(diào)用其所有注冊的Action偵聽器的actionPerformed()方法。
以下代碼使用lambda表達式向JButton添加Actionlistener:
closeButton.addActionListener(e -> System.exit(0));
以下代碼顯示了如何為關(guān)閉按鈕添加點擊事件處理程序以退出Swing應(yīng)用程序。
import java.awt.Container; //from w w w. ja v a 2 s .c o m import javax.swing.JButton; import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); // Add a close button JButton closeButton = new JButton("Close"); contentPane.add(closeButton); closeButton.addActionListener(e -> System.exit(0)); frame.pack(); frame.setVisible(true); } }
以下代碼將操作偵聽器添加到具有匿名類的按鈕。
import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /*from ww w .j ava 2 s.co m*/ import javax.swing.JButton; import javax.swing.JFrame; public class Main { static int counter; public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); JButton counterButton = new JButton("Clicked #0"); JButton closeButton = new JButton("Close"); frame.setLayout(new FlowLayout()); contentPane.add(closeButton); contentPane.add(counterButton); counterButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { counterButton.setText("Clicked #" + counter++); } }); closeButton.addActionListener(e -> System.exit(0)); frame.pack(); frame.setVisible(true); } }
此示例顯示如何從JButton獲取操作命令。 動作命令是一個字符串對象,我們可以使用它來計算哪個按鈕被點擊。
import java.awt.Container; /*from w w w . j a va 2 s . c o m*/ import javax.swing.JButton; import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); // Add a close button JButton closeButton = new JButton("Close"); contentPane.add(closeButton); closeButton.addActionListener(e ->{ System.out.println(e.getActionCommand()); System.exit(0); } ); frame.pack(); frame.setVisible(true); } }
我們可以處理鼠標(biāo)事件,例如鼠標(biāo)點擊,進入,退出,按下和釋放組件。
MouseEvent類的一個對象表示組件上的鼠標(biāo)事件。
要處理Mouse事件,請使用MouseListener接口。這里是如何聲明接口:
public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e); public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e); }
MouseListener接口有五個方法,我們不能使用lambda表達式來創(chuàng)建鼠標(biāo)事件處理程序。
當(dāng)發(fā)生特定的鼠標(biāo)事件時,將調(diào)用MouseListener接口的一種方法。
MouseEvent類具有向我們提供有關(guān)鼠標(biāo)事件的詳細(xì)信息的方法:
getClickCount()方法返回鼠標(biāo)點擊次數(shù)。getX()和getY()方法返回鼠標(biāo)的x和y位置。getXOnScreen()和getYOnScreen()方法返回鼠標(biāo)的絕對x和y位置。
以下代碼演示了JButton的鼠標(biāo)輸入和退出事件。
import java.awt.Container; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; //from w w w.ja v a 2 s .co m import javax.swing.JButton; import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); JButton closeButton = new JButton("Close"); contentPane.add(closeButton); closeButton.addActionListener(e -> System.exit(0)); // Add a MouseListener to the JButton closeButton.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { closeButton.setText("Mouse has entered!"); } @Override public void mouseExited(MouseEvent e) { closeButton.setText("Mouse has exited!"); } }); frame.pack(); frame.setVisible(true); } }
Swing包括一些事件偵聽器接口的方便類。類名稱以Adapter結(jié)尾。
Adapter類被聲明為抽象,并且實現(xiàn)了一種Listener接口。
Adapter類為事件偵聽器接口中的所有方法提供了空實現(xiàn)。
并非所有事件偵聽器接口都具有對應(yīng)的適配器類。具有多個方法的事件偵聽器接口具有對應(yīng)的適配器類。
以下代碼在上面的代碼中重寫了事件處理程序。
import java.awt.Container; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /*from w ww . j ava 2 s .c om*/ import javax.swing.JButton; import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("JFrame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); JButton closeButton = new JButton("Close"); contentPane.add(closeButton); closeButton.addActionListener(e -> System.exit(0)); // Add a MouseListener to the JButton closeButton.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { closeButton.setText("Mouse has entered!"); } @Override public void mouseExited(MouseEvent e) { closeButton.setText("Mouse has exited!"); } }); frame.pack(); frame.setVisible(true); } }
更多建議: