Java Swing教程 - 事件

2018-01-09 19:23 更新

Java Swing教程 - 事件


Swing中的事件是用戶采取的動作。 例如,按下按鈕,在鍵盤上向下/向上按下一個鍵。

事件的源是生成事件的組件。例如,當(dāng)我們按下一個JButton時,點(diǎn)擊的事件發(fā)生在那個JButton上。 在這種情況下,JButton是點(diǎn)擊事件的來源。

事件表示在源組件上發(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表達(dá)式向JButton添加Actionlistener:

closeButton.addActionListener(e ->  System.exit(0));

以下代碼顯示了如何為關(guān)閉按鈕添加點(diǎ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);
  }
}


實(shí)施例2

此示例顯示如何從JButton獲取操作命令。 動作命令是一個字符串對象,我們可以使用它來計算哪個按鈕被點(diǎn)擊。

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)事件,例如鼠標(biāo)點(diǎn)擊,進(jìn)入,退出,按下和釋放組件。

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表達(dá)式來創(chuàng)建鼠標(biāo)事件處理程序。

當(dāng)發(fā)生特定的鼠標(biāo)事件時,將調(diào)用MouseListener接口的一種方法。

MouseEvent類具有向我們提供有關(guān)鼠標(biāo)事件的詳細(xì)信息的方法:

getClickCount()方法返回鼠標(biāo)點(diǎn)擊次數(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類被聲明為抽象,并且實(shí)現(xiàn)了一種Listener接口。

Adapter類為事件偵聽器接口中的所有方法提供了空實(shí)現(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);
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號