事件驱动程序设计

更新时间:2024-05-22 11:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

事件驱动程序设计(英语:Event-driven programming)是一种电脑程序设计模型。这种模型的程序运行流程是由用户的动作(如鼠标的按键,键盘的按键动作)或者是由其他程序的消息来决定的。相对于批处理程序设计(batch programming)而言,程序运行的流程是由程序员来决定。批量的程序设计在初级程序设计教学课程上是一种方式。然而,事件驱动程序设计这种设计模型是在交互程序(Interactive program)的情况下孕育而生的。

事件驱动程序可以由任何编程语言来实现,然而使用某些语言来撰写会比其他的语言来的简单。有些集成开发环境(简称IDE)也会影响实现事件驱动程序设计的难易程度。有的 IDE 会使的开发工作变的很简单,有的则否。

取代传统上一次等待一个完整的指令然后再做运行的方式,事件驱动程序模型下的系统,基本上的架构是预先设计一个事件循环所形成的程序,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数进行必要的处理。其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动作,或者是一个时间事件。

对一个事件驱动(event driven)系统进行程序设计,因此可以视为改写系统默认触发函数的行为,来符合自己需要的一种动作。输入的事件可以放进事件循环或者是经由已经注册的中断处理器来与硬件事件交互;而许多的软件系统使用了混和这两种技术的处理。预先设计好的算法确定了一件事,那就是当他们被需要的时候,就会在适当的时机被触发。也因此提供了一个模拟中断驱动环境(interrupt driven environment)的软件抽象架构。事件驱动程序设计基本上包含了许多小程序片段,这些小程序片段被称为事件处理器并且被用来回应外部的事件与分发事件。通常尚未被事件处理器处理的事件,都会被系统放在一个称为事件队列的数据结构中,等待被处理。

许多情况下,事件处理器可以自己触发事件,因此也可能形成一个事件串。 事件驱动程序设计的着重于弹性以及异步化上面,并且企图尽可能的modeless。 图形用户界面这类程序就是典型的事件驱动设计方式。

计算机操作系统是事件驱动程序的典型示例。在操作系统的最底层,中断处理器的动作就像是硬件事件的直接处理器,搭配着 CPU 运行分配事件规则动作。对软件进程而言,基本上操作系统可视为一个事件分配器,发送数据和软件中断给用户自己写的软件进程。

package text;

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class Frame extends JFrame { JTextField text;

JLabel nowBomb, setBomb;

int BombNum, BlockNum; // 当前雷数,当前方块数

int rightBomb, restBomb, restBlock; // 找到的地雷数,剩余雷数,剩余方块数

JButton start = new JButton(\开始 \ JPanel MenuPamel = new JPanel(); JPanel bombPanel = new JPanel(); Bomb[][] bombButton;

JPanel c;

BorderLayout borderLayout1 = new BorderLayout(); GridLayout gridLayout1 = new GridLayout(); public Frame() { try {

setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit(); }

catch (Exception exception) { exception.printStackTrace(); } }

private void jbInit() throws Exception { c = (JPanel) getContentPane(); setTitle(\扫雷\

c.setBackground(Color.WHITE); MenuPamel.setBackground(Color.GRAY); c.setLayout(borderLayout1); setSize(new Dimension(600, 600)); setResizable(false);

BlockNum = 144; BombNum = 10;

text = new JTextField(\

nowBomb = new JLabel(\当前雷数\ setBomb = new JLabel(\设置地雷数\

start.addActionListener(new Frame1_start_actionAdapter(this));

MenuPamel.add(setBomb); MenuPamel.add(text); MenuPamel.add(start); MenuPamel.add(nowBomb);

c.add(MenuPamel, java.awt.BorderLayout.SOUTH);

bombPanel.setLayout(gridLayout1);

gridLayout1.setColumns( (int) Math.sqrt(BlockNum)); gridLayout1.setRows( (int) Math.sqrt(BlockNum));

bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)];

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) { bombButton[i][j] = new Bomb(i, j);

//bombButton[i][j].setSize(10, 10);

bombButton[i][j].setFont(new Font(\PLAIN, 14));//设置字体大小

bombButton[i][j].setForeground(Color.white);

bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this)); bombButton[i][j].addActionListener(new Bomb_actionAdapter(this)); bombPanel.add(bombButton[i][j]); } }

c.add(bombPanel, java.awt.BorderLayout.CENTER);

startBomb(); }

/* 开始按钮 */

public void start_actionPerformed(ActionEvent e) { int num=Integer.parseInt(text.getText().trim()); if (num >= 5 && num < 50) { BombNum = num; startBomb(); }

else if (num < 5) {

JOptionPane.showMessageDialog(null, \您设置的地雷数太少了,请重设!\错误\

JOptionPane.ERROR_MESSAGE); num=10; BombNum = num; } else {

JOptionPane.showMessageDialog(null, \您设置的地雷数太多了,请重设!\错误\

JOptionPane.ERROR_MESSAGE); num=10; BombNum = num; } }

/* 开始,布雷 */

public void startBomb() {

nowBomb.setText(\当前雷数\:\

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

bombButton[i][j].isBomb = false; bombButton[i][j].isClicked = false; bombButton[i][j].isRight = false; bombButton[i][j].BombFlag = 0; bombButton[i][j].BombRoundCount = 9; bombButton[i][j].setEnabled(true); bombButton[i][j].setText(\

bombButton[i][j].setFont(new Font(\PLAIN, 14));//设置字体大小 bombButton[i][j].setForeground(Color.BLUE); rightBomb = 0; restBomb = BombNum;

restBlock = BlockNum - BombNum; } }

for (int i = 0; i < BombNum; ) {

int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1)); int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));

if (bombButton[x][y].isBomb != true) { bombButton[x][y].isBomb = true; i++; } }

CountRoundBomb(); }

/* 计算方块周围雷数 */

public void CountRoundBomb() {

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) { int count = 0;

// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数 if (bombButton[i][j].isBomb != true) { for (int x = i - 1; x < i + 2; x++) { for (int y = j - 1; y < j + 2; y++) { if ( (x >= 0) && (y >= 0)

&& (x < ( (int) Math.sqrt(BlockNum))) && (y < ( (int) Math.sqrt(BlockNum)))) { if (bombButton[x][y].isBomb == true) { count++; } }

} }

bombButton[i][j].BombRoundCount = count; } } } }

/* 是否挖完了所有的雷 */

public void isWin() {

restBlock = BlockNum - BombNum;

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) { if (bombButton[i][j].isClicked == true) { restBlock--; } } }

if (rightBomb == BombNum || restBlock == 0) {

JOptionPane.showMessageDialog(this, \您挖完了所有的雷,您胜利了!\胜利\

JOptionPane.INFORMATION_MESSAGE); startBomb(); } }

/** 当选中的位置为空,则翻开周围的地图* */

public void isNull(Bomb ClickedButton) { int i, j;

i = ClickedButton.num_x; j = ClickedButton.num_y;

for (int x = i - 1; x < i + 2; x++) { for (int y = j - 1; y < j + 2; y++) {

if ( ( (x != i) || (y != j)) && (x >= 0) && (y >= 0) && (x < ( (int) Math.sqrt(BlockNum))) && (y < ( (int) Math.sqrt(BlockNum)))) { if (bombButton[x][y].isBomb == false && bombButton[x][y].isClicked == false && bombButton[x][y].isRight == false) { turn(bombButton[x][y]);

} } } } }

/* 翻开 */

public void turn(Bomb ClickedButton) { ClickedButton.setEnabled(false); ClickedButton.isClicked = true;

if (ClickedButton.BombRoundCount > 0) {

ClickedButton.setText(ClickedButton.BombRoundCount + \ } else {

isNull(ClickedButton); } }

/* 左键点击 */

public void actionPerformed(ActionEvent e) { if ( ( (Bomb) e.getSource()).isClicked == false && ( (Bomb) e.getSource()).isRight == false) { if ( ( (Bomb) e.getSource()).isBomb == false) { turn( ( (Bomb) e.getSource())); isWin(); }

else {

for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) { for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) { if (bombButton[i][j].isBomb == true) { bombButton[i][j].setText(\雷\ } } }

( (Bomb) e.getSource()).setForeground(Color.RED);

( (Bomb) e.getSource()).setFont(new Font(\BOLD, 20)); ( (Bomb) e.getSource()).setText(\

JOptionPane.showMessageDialog(this, \你踩到地雷了,按确定重来\踩到地雷\

startBomb(); }

} }

/* 右键点击 */

public void mouseClicked(MouseEvent e) { Bomb bombSource = (Bomb) e.getSource();

boolean right = SwingUtilities.isRightMouseButton(e);

if ( (right == true) && (bombSource.isClicked == false)) { bombSource.BombFlag = (bombSource.BombFlag + 1) % 3; if (bombSource.BombFlag == 1) { if (restBomb > 0) {

bombSource.setForeground(Color.RED); bombSource.setText(\ bombSource.isRight = true; restBomb--; } else {

bombSource.BombFlag = 0; } }

else if (bombSource.BombFlag == 2) { restBomb++;

bombSource.setText(\ bombSource.isRight = false; } else {

bombSource.setText(\ }

if (bombSource.isBomb == true) { if (bombSource.BombFlag == 1) { rightBomb++; }

else if (bombSource.BombFlag == 2) { rightBomb--; } }

nowBomb.setText(\当前雷数\ isWin(); } }

public static void main(String[] args) { Frame frame = new Frame(); frame.setVisible(true); } }

class Frame1_start_actionAdapter implements ActionListener { private Frame adaptee;

Frame1_start_actionAdapter(Frame adaptee) { this.adaptee = adaptee; }

public void actionPerformed(ActionEvent e) { adaptee.start_actionPerformed(e); } }

class Bomb extends JButton { int num_x, num_y; int BombRoundCount; boolean isBomb; boolean isClicked; int BombFlag; boolean isRight;

public Bomb(int x, int y) { num_x = x; num_y = y; BombFlag = 0; BombRoundCount = 9; isBomb = false; isClicked = false; isRight = false; } }

class Bomb_actionAdapter implements ActionListener { private Frame adaptee;

Bomb_actionAdapter(Frame adaptee) { this.adaptee = adaptee; }

public void actionPerformed(ActionEvent e) { adaptee.actionPerformed(e); } }

class Bomb_mouseAdapter extends MouseAdapter { private Frame adaptee;

Bomb_mouseAdapter(Frame adaptee) { this.adaptee = adaptee; }

public void mouseClicked(MouseEvent e) { adaptee.mouseClicked(e); } }

本文来源:https://www.bwwdw.com/article/vfv7.html

Top