当前位置: 首页 > 知识库问答 >
问题:

SWING actionPerformed从未调用

钱卓君
2023-03-14
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.*;


public class Plateau{
Fenetre f;
Modele mo;
CaseListener co;
BoutonListener li; 

public Plateau(int dim){
this.f = new Fenetre(dim);
this.mo = new Modele();
this.co = new CaseListener();
this.li = new BoutonListener();
}

private class Fenetre extends JFrame{

public JPanel principale; // partie informative
public JPanel grille; // grille de jeu
public Case [][] tabs; 
public int dim;

private static final String bf1 = "bf1.png";
private static final String mf1  = "mf1.png";
private static final String nf1 = "nf1.png";

private static final String bf2 = "bf2.png";
private static final String mf2  = "mf2.png";
private static final String nf2 = "nf2.png";

Container c = this.getContentPane();

JButton b = new JButton("bon"); // boutons pour ajouter les fantomes
JButton m = new JButton("mauvais");

public Fenetre(int dim){
this.dim = dim;
this.tabs = new Case[this.dim][this.dim];

c.setLayout(new GridLayout(0,2));
JPanel principale = new JPanel();
JPanel grille = new JPanel();
JLabel lab = new JLabel("Test");
principale.add(lab);

b.addActionListener(li);   
m.addActionListener(li);

principale.add(b);
principale.add(m);

c.add(principale);
grille.setBackground(Color.black);
c.add(grille);

this.setVisible(true);
this.setSize(600,300);
this.setLocationRelativeTo(null);
this.setTitle("Ghosts");

grille.setLayout(new GridLayout(this.dim, this.dim));

for(int i = 0; i < this.dim ; i++){
    for(int j = 0; j < this.dim ; j++){

// création de toutes les cases

    tabs[i][j] = new Case();
    tabs[i][j].addMouseListener(co);

    tabs[i][j].setBorder(BorderFactory.createLineBorder(Color.BLACK));
    grille.add(tabs[i][j]);

    if( (i == 0 || i == this.dim-1) && ( j == 0 || j == this.dim-1  )){ // cases sorties
        tabs[i][j].setBackground(Color.BLUE);
    }

    }
}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void miseAJour(){
    for(int i = 0 ; i < this.dim ; i++){
    for(int j = 0 ; j < this.dim ; j++){
        tabs[i][j].repaint();
    }
    }
}

}



private class Modele{

    int total = 0;
    int bj1 = 0;
    int mj1 = 0;
    int bj2 = 0;
    int mj2 = 0;



    public Case prochainePlace(){
        for(int i = 0; i < f.dim ; i++){
        for(int j = 0; j < f.dim ; j++){

            if(j !=0 && j != f.dim - 1 && (i > f.dim-3 || (i < 2)) ){  // fantomes J1
            if(f.tabs[i][j].getFantome() == null){
                total++; 
                return f.tabs[i][j];

            }
            }
        }

        }

        return null;
    }

    public boolean remplissable(){
        return((bj1 + bj2 + mj1 + mj2) < (f.dim *2)-4 );
    }

    public void ajoutFantome(Case c , boolean bon){
        if(total <= 8){
        if(bon && bj1 < 4){
            c.setFantome(new Fantome(true, Fenetre.bf1 , 2 ));

            c.repaint();
            bj1++;
        }
        if(!bon && mj1 < 4){
            c.setFantome(new Fantome(false,Fenetre.mf1 , 1 ));

            c.repaint();
            mj1++;
        }
        }
        else{
        if(bon && bj2 < 4 ){
            c.setFantome(new Fantome(true, Fenetre.bf2 , 2 ));

            c.repaint();
            bj2++;
        }
        if(!bon && mj2 < 4){
            c.setFantome(new Fantome(false, Fenetre.mf2 , 2 ));

            c.repaint();
            mj2++;
        }
        }
    }

    }

private class BoutonListener implements ActionListener{

    public void actionPerformed(ActionEvent e){
        System.out.println("fonction called");
        if(mo.remplissable()){

        if(e.getSource() == f.b){
            mo.ajoutFantome(mo.prochainePlace(), true);
            f.miseAJour();
        }
        else{
            mo.ajoutFantome(mo.prochainePlace(), false);
            f.miseAJour();
        }
        }
    }

}


private class CaseListener implements MouseListener{


    public void mouseClicked(MouseEvent e){

    }

    public void mouseExited(MouseEvent e){

    }   

    public void mousePressed(MouseEvent e){

    }

    public void mouseReleased(MouseEvent e){

    }

    public void mouseEntered(MouseEvent e){

    }

    }

}

共有1个答案

晏望
2023-03-14

请注意您的Plateaue构造函数:

public Plateau(int dim) {
    this.f = new Fenetre(dim);  // (A)
    this.mo = new Modele();
    this.li = new BoutonListener();  // (B)
}

在第(A)行创建Fenetre JFrame,在这里将ActionListener li添加到JButtons,但是在创建JFrame之后,在第(B)行为li变量分配一个ActionListener。因此,您实际上是在Fenetre构造函数中将空引用作为ActionListeners添加到JButtons中:

    public Fenetre(int dim) {

        // .... <deleted code>

        // li is null here!
        b.addActionListener(li);
        m.addActionListener(li);

一个解决方案:扭转这一局面。

public Plateau(int dim) {
    this.li = new BoutonListener();  // call this first
    this.f = new Fenetre(dim);  
    this.mo = new Modele();
}
public Plateau(int dim) {
    this.f = new Fenetre(dim);  
    this.mo = new Modele();
    f.addBoutonListener(new BoutonListener());
}
    public void addBoutonListener(BoutonListener btnListener) {
        b.addActionListener(btnListener);
        m.addActionListener(btnListener);
    }
 类似资料:
  • 问题内容: 我有以下代码: 从不调用completionHandler函数。我尝试在浏览器中调用该URL,但工作正常。我尝试使用另一个URL,但仍然无法正常工作。我检查了一下我的ios模拟器是否可以连接到Internet,确实可以。 我不知道为什么不调用该函数,并且由于我没有任何错误,因此很难调试。 问题答案: 该任务永远不会完成,因为它永远不会开始。您必须使用其方法手动启动数据任务。

  • 我的从未被调用,即使我在inapp对话框中单击立即购买,logcat也不会打印任何内容。

  • 我正在将FireBase推送通知集成到我的应用程序中。虽然我收到推送通知(当应用程序在后台时),但我的onMessageRec的(远程消息远程消息)从来没有被调用,无论应用程序是在前台还是后台。如果这是FCM的问题,或者我做错了什么。我在我的应用程序中使用com.google.firebase: Firebase消息传递: 9.0.0build.gradle.我已经在我的应用程序清单中声明了这两个

  • 我想在我的android设备收到推送通知时执行一些代码。我有以下文件:、。 在中,我启动消息服务: 并且在中,我重写了方法,如下所示: 此外,在我的中,我在中有以下设置: 然后我触发通知,它出现在我的设备上(它震动,我看到通知的标题): 但是,我在中的代码从来没有执行过。 我注意到中的日志也没有被调用,所以我假设整个类都被完全忽略了。 我做了很多研究,有很多类似的问题,但我发现的所有修复,如关于清

  • 问题:为什么从不调用? 我在xml配置中扩展了,如 MyEntityManagerFactoryBean MyInterceptor: 更新:[解释为什么自定义脏政策看起来不像我的方式] 我希望每次更改实体中的内容时更新时间戳,但除外。同时,应该是持久的,而不是暂时的(意味着导致实体变脏)。 由于我使用Spring事务和Hibernate模板,有一些细微差别: 1) 我无法在每个setter的末尾

  • 问题内容: 我有一个由sqlite数据库提供的listview。我在几个不同的点调用fillData()来更新listview。 那行得通…问题是,当我打开/关闭/跳转活动时,logcat中出现错误。它不会使程序崩溃。错误是: 请确保您在游标上显式调用close(), 并且 从未在数据库上显式调用close() 因此,在})下;如果我将mDbHelper.close()放进去,则崩溃,提示数据库未