MVC AddActionListener 不起作用
MVC AddActionListener doesn't work
如标题所述,我在一个项目中遇到了问题,该项目强加给我们使用 MVC 模式来实现游戏 "Colt Express"。来不及再return了,但我不明白我的代码哪里有问题
为了让您对游戏有所了解,每个车上都有车厢,每个车厢都有一个屋顶。有些歹徒可以移动射击或举起货车和屋顶上的宝藏。还有一种治安官,每次看到歹徒就开枪(如果在同一辆马车或车顶,同一个位置)
动作的过程是特别的,有两个阶段,第一个阶段,第一个黑帮通过点击相关按钮选择固定数量的动作,然后是第二个等
这是第二个阶段,当点击操作按钮时,第一个黑帮的第一个动作完成,然后第二个黑帮的一个接一个点击,你可以看到一个接一个,每次点击动作按钮只会发生一个动作。之后其他动作也一样
当我点击时,没有任何反应,我设置了一个 "System.out.println("nothing work") 但它不会在点击时打印任何内容。使用 setActionCommand() 我将一个字符串关联到方法 AddActionListener 上的每个按钮(ActionListener aclick)
并在 class Controleur 上实例化并根据需要创建一个方法 actionPerformed(ActionListener aclick) ,该方法根据我们通过使用 getActionCommand
单击获得的字符串执行某些操作
这里有一个class关注我的问题:
public class VueBoutons extends JPanel {
Direction dir;
JButton Action = new JButton("Action !");
JButton Avance = new JButton("Avancer");
JButton Recule = new JButton("Reculer");
JButton Monte = new JButton("Monter");
JButton Descend = new JButton("Descendre");
JButton Braque = new JButton("Braquer");
JButton TirHaut = new JButton("TirHaut");
JButton TirBas = new JButton("TirBas");
JButton TirDroite = new JButton("TirDroit");
JButton TirGauche = new JButton("TirGauche");
public VueBoutons() {
this.add(Action);
this.add(Avance);
this.add(Recule);
this.add(Monte);
this.add(Descend);
this.add(Braque);
this.add(TirHaut);
this.add(TirBas);
this.add(TirDroite);
this.add(TirGauche);
disableboutAction(); // Au début on ne peut pas cliquer sur Action ! }
public void addActionListener(ActionListener e) {
Action.setActionCommand("10");
Action.addActionListener(e);
Avance.setActionCommand("1");
Avance.addActionListener(e);
Recule.setActionCommand("2");
Recule.addActionListener(e);
Monte.setActionCommand("3");
Monte.addActionListener(e);
Descend.setActionCommand("4");
Descend.addActionListener(e);
Braque.setActionCommand("5");
Braque.addActionListener(e);
TirHaut.setActionCommand("6");
TirHaut.addActionListener(e);
TirBas.setActionCommand("7");
TirBas.addActionListener(e);
TirDroite.setActionCommand("8");
TirDroite.addActionListener(e);
TirGauche.setActionCommand("9");
TirGauche.addActionListener(e);
}
public void disableActions() {
Avance.setEnabled(false);
Recule.setEnabled(false);
Monte.setEnabled(false);
Descend.setEnabled(false);
TirHaut.setEnabled(false);
TirBas.setEnabled(false);
TirGauche.setEnabled(false);
TirDroite.setEnabled(false);
Braque.setEnabled(false);
}
public void disableboutAction() {
Action.setEnabled(false);
}
public void enableActions() {
Avance.setEnabled(true);
Recule.setEnabled(true);
Monte.setEnabled(true);
Descend.setEnabled(true);
TirHaut.setEnabled(true);
TirBas.setEnabled(true);
TirGauche.setEnabled(true);
TirDroite.setEnabled(true);
Braque.setEnabled(true);
}
public void enableboutAction() {
Action.setEnabled(true);
}
public void disableTout() {
Avance.setEnabled(false);
Recule.setEnabled(false);
Monte.setEnabled(false);
Descend.setEnabled(false);
TirHaut.setEnabled(false);
TirBas.setEnabled(false);
TirGauche.setEnabled(false);
TirDroite.setEnabled(false);
Braque.setEnabled(false);
Action.setEnabled(false);
}}
第二个 class:
public class Controleur {
private int a;
private int numj;
private int numact;
private Modele modele;
private VueInterface vueI;
public Controleur(Modele modele, VueInterface vueI) {
System.out.println("work");
this.numj = 0;
this.numact = 0;
this.modele = modele;
this.vueI = new VueInterface(modele);
vueI.getCommandes().addActionListener(new CActionListener());
// Instancie l'équivalent de la classe "Controleur" de Conway
// de sorte à avoir une classe séparé et non pas interne
}
class CActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
a = Integer.parseInt(e.getActionCommand());
System.out.println("It doesn't even work until here...............");
if (modele.getPhaseP() && !modele.getPhaseA() && a <= Direction.values().length * 2) {
// Cf classe Modele méthode uneAction() pour la condition
modele.getListBandits().get(numj).ajouteAction(a);
if (numact < modele.getNbactions())
++numact;
else if (numj < modele.getNbjoueurs()) {
numact = 0;
++numj;
} else {
numj = 0;
numact = 0;
System.out.println("******** Fin de la phase de planification ********");
vueI.getCommandes().disableActions();
vueI.getCommandes().enableboutAction();
modele.setPhaseP(false);
modele.setPhaseA(true);
}
} else if (modele.getPhaseA() && !modele.getPhaseP()) {
if(a == 10) {
modele.uneAction(numj, numact);
if(numj < modele.getNbjoueurs()) // On fait toutes les 1res actions de chaque joueurs etc
++numj;
else if (numact < modele.getNbactions()) {
numj = 0;
++numact;
} else {
modele.setPhaseP(false);
modele.setPhaseA(false);
}
}
}
}
}}
最后一个部分关注:
public class VueInterface extends JPanel {
private JFrame fenetre;
private JFrame actions;
private VueBoutons commandes;
private VueGrille grille;
private VueListeActions liactions;
public VueInterface(Modele modele) {
this.fenetre = new JFrame("Colt Express");
this.actions = new JFrame("Actions");
this.commandes = new VueBoutons();
this.grille = new VueGrille(modele);
this.liactions = new VueListeActions(modele);
fenetre.setLayout(new BorderLayout());
JPanel boutons = new JPanel(new FlowLayout());
boutons.add(commandes);
fenetre.add(boutons, BorderLayout.NORTH);
fenetre.add(grille.getGrid(), BorderLayout.CENTER);
actions.add(liactions.getPane());
actions.pack();
//fenetre.setResizable(false);
fenetre.pack();
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public VueBoutons getCommandes() {
return commandes;
}
public JFrame getActionFrame() {
return actions;
}
public JFrame getFrame() {
return fenetre;
}}
感谢您的帮助!!
在我看来,在你的 Controleur
的构造函数中有 2 vueI
:
this.vueI = new VueInterface(modele);
vueI.getCommandes().addActionListener(new CActionListener());
这两行影响不同的 VueInterface
个实例。
如标题所述,我在一个项目中遇到了问题,该项目强加给我们使用 MVC 模式来实现游戏 "Colt Express"。来不及再return了,但我不明白我的代码哪里有问题
为了让您对游戏有所了解,每个车上都有车厢,每个车厢都有一个屋顶。有些歹徒可以移动射击或举起货车和屋顶上的宝藏。还有一种治安官,每次看到歹徒就开枪(如果在同一辆马车或车顶,同一个位置)
动作的过程是特别的,有两个阶段,第一个阶段,第一个黑帮通过点击相关按钮选择固定数量的动作,然后是第二个等 这是第二个阶段,当点击操作按钮时,第一个黑帮的第一个动作完成,然后第二个黑帮的一个接一个点击,你可以看到一个接一个,每次点击动作按钮只会发生一个动作。之后其他动作也一样
当我点击时,没有任何反应,我设置了一个 "System.out.println("nothing work") 但它不会在点击时打印任何内容。使用 setActionCommand() 我将一个字符串关联到方法 AddActionListener 上的每个按钮(ActionListener aclick) 并在 class Controleur 上实例化并根据需要创建一个方法 actionPerformed(ActionListener aclick) ,该方法根据我们通过使用 getActionCommand
单击获得的字符串执行某些操作这里有一个class关注我的问题:
public class VueBoutons extends JPanel {
Direction dir;
JButton Action = new JButton("Action !");
JButton Avance = new JButton("Avancer");
JButton Recule = new JButton("Reculer");
JButton Monte = new JButton("Monter");
JButton Descend = new JButton("Descendre");
JButton Braque = new JButton("Braquer");
JButton TirHaut = new JButton("TirHaut");
JButton TirBas = new JButton("TirBas");
JButton TirDroite = new JButton("TirDroit");
JButton TirGauche = new JButton("TirGauche");
public VueBoutons() {
this.add(Action);
this.add(Avance);
this.add(Recule);
this.add(Monte);
this.add(Descend);
this.add(Braque);
this.add(TirHaut);
this.add(TirBas);
this.add(TirDroite);
this.add(TirGauche);
disableboutAction(); // Au début on ne peut pas cliquer sur Action ! }
public void addActionListener(ActionListener e) {
Action.setActionCommand("10");
Action.addActionListener(e);
Avance.setActionCommand("1");
Avance.addActionListener(e);
Recule.setActionCommand("2");
Recule.addActionListener(e);
Monte.setActionCommand("3");
Monte.addActionListener(e);
Descend.setActionCommand("4");
Descend.addActionListener(e);
Braque.setActionCommand("5");
Braque.addActionListener(e);
TirHaut.setActionCommand("6");
TirHaut.addActionListener(e);
TirBas.setActionCommand("7");
TirBas.addActionListener(e);
TirDroite.setActionCommand("8");
TirDroite.addActionListener(e);
TirGauche.setActionCommand("9");
TirGauche.addActionListener(e);
}
public void disableActions() {
Avance.setEnabled(false);
Recule.setEnabled(false);
Monte.setEnabled(false);
Descend.setEnabled(false);
TirHaut.setEnabled(false);
TirBas.setEnabled(false);
TirGauche.setEnabled(false);
TirDroite.setEnabled(false);
Braque.setEnabled(false);
}
public void disableboutAction() {
Action.setEnabled(false);
}
public void enableActions() {
Avance.setEnabled(true);
Recule.setEnabled(true);
Monte.setEnabled(true);
Descend.setEnabled(true);
TirHaut.setEnabled(true);
TirBas.setEnabled(true);
TirGauche.setEnabled(true);
TirDroite.setEnabled(true);
Braque.setEnabled(true);
}
public void enableboutAction() {
Action.setEnabled(true);
}
public void disableTout() {
Avance.setEnabled(false);
Recule.setEnabled(false);
Monte.setEnabled(false);
Descend.setEnabled(false);
TirHaut.setEnabled(false);
TirBas.setEnabled(false);
TirGauche.setEnabled(false);
TirDroite.setEnabled(false);
Braque.setEnabled(false);
Action.setEnabled(false);
}}
第二个 class:
public class Controleur {
private int a;
private int numj;
private int numact;
private Modele modele;
private VueInterface vueI;
public Controleur(Modele modele, VueInterface vueI) {
System.out.println("work");
this.numj = 0;
this.numact = 0;
this.modele = modele;
this.vueI = new VueInterface(modele);
vueI.getCommandes().addActionListener(new CActionListener());
// Instancie l'équivalent de la classe "Controleur" de Conway
// de sorte à avoir une classe séparé et non pas interne
}
class CActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
a = Integer.parseInt(e.getActionCommand());
System.out.println("It doesn't even work until here...............");
if (modele.getPhaseP() && !modele.getPhaseA() && a <= Direction.values().length * 2) {
// Cf classe Modele méthode uneAction() pour la condition
modele.getListBandits().get(numj).ajouteAction(a);
if (numact < modele.getNbactions())
++numact;
else if (numj < modele.getNbjoueurs()) {
numact = 0;
++numj;
} else {
numj = 0;
numact = 0;
System.out.println("******** Fin de la phase de planification ********");
vueI.getCommandes().disableActions();
vueI.getCommandes().enableboutAction();
modele.setPhaseP(false);
modele.setPhaseA(true);
}
} else if (modele.getPhaseA() && !modele.getPhaseP()) {
if(a == 10) {
modele.uneAction(numj, numact);
if(numj < modele.getNbjoueurs()) // On fait toutes les 1res actions de chaque joueurs etc
++numj;
else if (numact < modele.getNbactions()) {
numj = 0;
++numact;
} else {
modele.setPhaseP(false);
modele.setPhaseA(false);
}
}
}
}
}}
最后一个部分关注:
public class VueInterface extends JPanel {
private JFrame fenetre;
private JFrame actions;
private VueBoutons commandes;
private VueGrille grille;
private VueListeActions liactions;
public VueInterface(Modele modele) {
this.fenetre = new JFrame("Colt Express");
this.actions = new JFrame("Actions");
this.commandes = new VueBoutons();
this.grille = new VueGrille(modele);
this.liactions = new VueListeActions(modele);
fenetre.setLayout(new BorderLayout());
JPanel boutons = new JPanel(new FlowLayout());
boutons.add(commandes);
fenetre.add(boutons, BorderLayout.NORTH);
fenetre.add(grille.getGrid(), BorderLayout.CENTER);
actions.add(liactions.getPane());
actions.pack();
//fenetre.setResizable(false);
fenetre.pack();
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public VueBoutons getCommandes() {
return commandes;
}
public JFrame getActionFrame() {
return actions;
}
public JFrame getFrame() {
return fenetre;
}}
感谢您的帮助!!
在我看来,在你的 Controleur
的构造函数中有 2 vueI
:
this.vueI = new VueInterface(modele);
vueI.getCommandes().addActionListener(new CActionListener());
这两行影响不同的 VueInterface
个实例。