事件驱动程序设计
更新时间: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); } }
正在阅读:
事件驱动程序设计05-22
最新最全自考保险法学习复习笔记04-27
汽车转向梯形优化设计04-05
(no.1)2013年高中数学教学论文 《浅谈高考数学填空题的解题方法》08-09
在线清洗01-20
区发展和改革局最新半年工作总结及2022年工作计划范本04-04
2018-2019年初中化学湖北中考模拟真卷含答案考点及解析12-29
天津市高校学生社团管理条例07-09
学前卫生学资料03-27
上大学的机会成本分析12-31
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 程序设计
- 驱动
- 事件
- 张秀兰 熊义成《基础会计》课后练习参考答案
- 青岛版五四制四年级上册电子课本 - 图文
- 西安交通大学18年9月课程考试《电力系统自动装置(高起专)》作业
- 从怀孕到分娩全程记录
- 粉喷桩在公路软土路基中应用
- 甘肃省实施《中华人民共和国母婴保健法》办法
- 天天向上6月27日答案及解析
- 资源储量估算注意问题 - 图文
- 气象预报测报科研业务管理岗位实习报告
- 乒乓球协会成立主持词
- 2015年度安全承诺书
- 表外业务的存在问题
- 医师定期考核题库(急诊)
- 2018年中国视频监控现状调研及市场前景预测(目录) - 图文
- (新)41动态秀主持广播稿(七)
- 矿井环境监测仪器仪表本科实验指导书-1
- 大学英语大纲
- 专业技术人员职业道德 考试 80分
- 2014年春新人教版二年级数学第三单元《图形的运动(一)》概述
- 语言:痒痒树(文学活动)