package org.minesales.jiehe.calculatrice.controleur;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import org.minesales.jiehe.calculatrice.modele.Accumulateur;
import org.minesales.jiehe.calculatrice.modele.Pile;
import org.minesales.jiehe.calculatrice.vue.Vue;
/**
* La classe Controleur gère les collaborations entre la vue et les modèles. Elle a arrivé d'implementer les qutres écouteurs en même temps par hériter la classe MonAdapter.
* @author Jie He
*
*/
public class Controleur extends MonAdapter //La classe MonAdapter implémente WindowListener, ActionListener, KeyListener,PropertyChangeListener
{
private Vue laVue;
private Accumulateur lAccumulateur;
private Pile laPile;
private String buttonAction = "";
private String operandeStr = "0";
private boolean virguleMarque = false;
private boolean signeMarque = false;
private boolean operationMarque = false;
private String keyStr = "";
private int code = 0;
public Controleur() {
laVue = new Vue();
lAccumulateur = new Accumulateur();
laPile = lAccumulateur.getLaPile();
/*
* Enregistrer les 4 écouteurs vers la vue (actionListener, keyListener
* et windowListener), l'accumulator (propertyChangeListener) et
* la pile (propertyChangeListener)
*/
laVue.addFrameListener(this);
laVue.addKeyListener(this);
laVue.addButtonListener(this);
lAccumulateur.addAccChangeListener(this);
laPile.addPileChangeListener(this);
}
// Régler les quatres types d'événements qui viennent des quatres écouteurs.
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(Long.MAX_VALUE);
buttonAction = e.getActionCommand();
try { buttonActionAnalysis(buttonAction);
} catch (Exception exc) {//Régler les deux possibles exceptions dans la méthode calculation.
if (exc.getMessage().equals(lAccumulateur.getNULLPILE_EXC()))
laVue.displayErrorMessage("Typez un autre nombre, SVP !");
else if (exc.getMessage().equals(lAccumulateur.getDIVSEUR_EXC()))
laVue.displayErrorMessage("Vérifiez le diviseur, SVP !");
else if (exc.getMessage().equals(lAccumulateur.getDEBORD_EXC())) {
laVue.displayErrorMessage("Il est trop grand pour l'afficher !");
}
}
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName()==laPile.getPROPERTY_NAME()){
for (int i = 1; i < laVue.getTextFields().length; i++) {
laVue.getTextFields()[i].setText(getPileElement(i-1));
}
}else if(evt.getPropertyName()== lAccumulateur.getPROPERTY_NAME1()){
laVue.getTextFields()[0].setText(operandeStr);
}else if(evt.getPropertyName()== lAccumulateur.getPROPERTY_NAME2()){
operandeStr = double2Str(lAccumulateur.getAccumulateur());
laVue.getTextFields()[0].setText(operandeStr);
}
}
@Override
public void keyPressed(KeyEvent e) {
code = e.getKeyCode();
if ((code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)
||(code >= KeyEvent.VK_NUMPAD0 && code <= KeyEvent.VK_DIVIDE)
|| code == KeyEvent.VK_PERIOD
|| code == KeyEvent.VK_COMMA) {
keyStr = String.valueOf(e.getKeyChar());
}
else if (code == KeyEvent.VK_ENTER) {keyStr = "<>";}
else if (code == KeyEvent.VK_MINUS) {keyStr = "+/-";}
else {laVue.displayErrorMessage("Mauvais entrée !");}
try { buttonActionAnalysis(keyStr);
} catch (Exception exc) {//Régler les deux possibles exceptions dans la méthode calculation.
if (exc.getMessage().equals("PileNull"))
laVue.displayErrorMessage("Typez un autre numbre, SVP !");
else if (exc.getMessage().equals("DivZero"))
laVue.displayErrorMessage("Vérifiez le diviseur, SVP !");
else if (exc.getMessage().equals("Debord")) {
laVue.displayErrorMessage("Il est trop grand pour l'afficher !");
}
}
}
@Override
public void keyTyped(KeyEvent e) {
e.consume();
}
/**
* Elle retourne l'élément de la pile.
* @param index La position d'élément
* @return Retourner l'élément de la pile
*/
private String getPileElement(int index) {
double d = 0;
try {
d = laPile.elementAt(laPile.size()-index-1);
} catch (ArrayIndexOutOfBoundsException e) {
return "";
}
return double2Str(d);
}
/**
* Elle change le type double vers le type String.
* @param d Le nombre double
* @return Retourner le String
*/
private String double2Str(double d) {
if (d % 1.0 == 0)
return String.valueOf((long)d);
else
return String.valueOf(d);
}
/**
* Elle analyse l'entrée et appelle des méthodes correspondants
* @param inputAction L'élément d'entrée
* @throws Exception L'exception de débordement de Double
*/
private void buttonActionAnalysis(String inputAction) throws Exception{
if (inputAction.equals("<>") ){
operandeStr = "0";
lAccumulateur.getLaPile().pushNum(lAccumulateur.getAccumulateur());
lAccumulateur.setAccumulateur(0.0);
virguleMarque = false; // Remettre la marque
signeMarque = false; // Remettre la marque
}
else if (inputAction.matches("[.,]")) {
analyserOperation(); // Analyser s'il y a déjà d'opération qui a eu lieu.
if (!virguleMarque){
operandeStr += ".";
virguleMarque = true;
refreshAcc();
}
}
else if (inputAction.matches("[0-9]")){
analyserOperation(); // Analyser s'il y a déjà d'opération qui a eu lieu.
if (inputAction.equals("0") && operandeStr.equals("0")) return;
else if (operandeStr.equals("0")) {
operandeStr = "";}
else if (operandeStr.equals("-0")) {operandeStr = "-";}
operandeStr += inputAction;
refreshAcc();
}
else if (inputAction.equals("+/-")) {
analyserOperation(); // Analyser s'il y a déjà d'opération qui a eu lieu.
if ((!signeMarque) && (operandeStr.charAt(0) != '-')) {// Ajouter le signe négatif
operandeStr = "-"+operandeStr;
signeMarque = true;
}else {// Retirer le signe négatif
operandeStr = operandeStr.substring(1,operandeStr.length());
signeMarque = false;
}
lAccumulateur.setAccumulateur(-lAccumulateur.getAccumulateur());
}
else if (inputAction.matches("[+/*-]")) {
operationMarque = true;
double result = lAccumulateur.calculation(inputAction);
operandeStr = double2Str(result);
lAccumulateur.setAccumulateur(result);
laVue.getTextFields()[0].setText(operandeStr);
}
else if (inputAction.equals("Tout Effacer")) {
operandeStr = "0";
lAccumulateur.setAccumulateur(0.0);
laPile.clearAll();
}
else if (inputAction.equals("Effacer")) {
operandeStr = "0";
lAccumulateur.setAccumulateur(0.0);
}
else if (inputAction.equals("Échanger")) {
operationMarque = true;
lAccumulateur.echanger();
}
}
private void analyserOperation() throws Exception {
if (operationMarque) { // Il faut appuyer le "<>" pour vider le contenu dans l'accumulateur.
buttonActionAnalysis("<>"); // Ajouter une action comme "Valider" pour empiler le contenu de l'accumulateur vers la Pile.
operationMarque = false; // Remettre la marque
}
}
private void refreshAcc() throws Exception{
lAccumulateur.setAccumulateur(Double.parseDouble(operandeStr));
}
public Vue getLaVue() {
return laVue;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Calculator-in-Java.zip_KeyListener
共71个文件
html:52个
java:6个
class:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 35 浏览量
2022-09-24
07:27:45
上传
评论
收藏 107KB ZIP 举报
温馨提示
应用经典的MVC设计模式实现的计算器app。其中包括WindowListener,PropertyChangeListener,Keylistener,ActionListener这四类监听器的使用细节。
资源推荐
资源详情
资源评论
收起资源包目录
Calculator-in-Java.zip (71个子文件)
Calculatrice
bin
org
minesales
jiehe
calculatrice
modele
Accumulateur.class 3KB
Pile.class 2KB
main
CalculatriceMain.class 694B
controleur
MonAdapter.class 2KB
Controleur.class 6KB
vue
Vue.class 4KB
.settings
org.eclipse.core.resources.prefs 112B
org.eclipse.jdt.core.prefs 598B
src
org
minesales
jiehe
calculatrice
modele
Pile.java 1KB
Accumulateur.java 3KB
main
CalculatriceMain.java 375B
controleur
MonAdapter.java 2KB
Controleur.java 7KB
vue
Vue.java 5KB
.project 388B
.classpath 301B
doc
package-list 163B
deprecated-list.html 4KB
help-doc.html 9KB
allclasses-frame.html 2KB
overview-summary.html 5KB
index.html 3KB
allclasses-noframe.html 1KB
serialized-form.html 5KB
overview-frame.html 1KB
stylesheet.css 13KB
constant-values.html 4KB
org
minesales
jiehe
calculatrice
modele
Pile.html 14KB
package-summary.html 5KB
package-frame.html 1KB
Accumulateur.html 17KB
class-use
Pile.html 7KB
Accumulateur.html 5KB
package-tree.html 6KB
package-use.html 6KB
main
CalculatriceMain.html 9KB
package-summary.html 5KB
package-frame.html 924B
class-use
CalculatriceMain.html 5KB
package-tree.html 5KB
package-use.html 4KB
controleur
Listeners.html 19KB
package-summary.html 5KB
package-frame.html 1KB
class-use
Listeners.html 7KB
MonAdapter.html 7KB
Controleur.html 11KB
package-tree.html 5KB
MonAdapter.html 19KB
package-use.html 8KB
Controleur.html 17KB
vue
package-summary.html 5KB
Vue.html 14KB
package-frame.html 894B
class-use
Vue.html 7KB
package-tree.html 5KB
package-use.html 6KB
index-files
index-10.html 5KB
index-7.html 6KB
index-11.html 5KB
index-1.html 8KB
index-8.html 5KB
index-9.html 7KB
index-6.html 6KB
index-5.html 8KB
index-3.html 5KB
index-2.html 7KB
index-4.html 5KB
index-12.html 8KB
overview-tree.html 6KB
script.js 857B
共 71 条
- 1
资源评论
四散
- 粉丝: 67
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- STM32F401,使用ST-link时候,不能识别,显示ST-LINK USB communication error
- 快速排序算法Python实现:详解分治法原理与高效排序步骤
- 陀螺仪选型陀螺仪陀螺仪选型型陀螺仪选型
- Intouch2020R2SP1与西门子1500PLC通讯配置手册
- 英特尔2021-2024年网络连接性和IPU路线图
- RuoYi-Cloud-Plus 微服务通用权限管理系统
- 家庭用具检测15-YOLO(v8至v11)数据集合集.rar
- deploy.yaml
- PHP快速排序算法实现与优化
- 2023-04-06-项目笔记 - 第三百五十五阶段 - 4.4.2.353全局变量的作用域-353 -2025.12.22
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功