java - 在 MVC 上的一个 Jframe 中有多个带有按钮的 Jpanel,如何在我的 Controller 中获取 actionlistener?

标签 java swing model-view-controller uiviewcontroller actionlistener

顺便说一句,这是作业,

我被要求制作一个包含多个 jpanel 的 jframe,这些 jpanel 有按钮和 Action 监听器。我必须使用 MVC 模型来执行此操作,但是由于我的按钮/操作位于 jpanels 而不是 jframe 中,所以我不知道如何恢复它们。我不会放下我所有的代码,但是,只是需要什么来查看我尝试做的事情。我想首先从面板 3 获取按钮“ajouter”以执行任何操作:

所以这是面板 3

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

import ca.uqam.inf2120.tp2.modele.GestionAbsenceEmployes;

public class RechercherAbsenceP3 extends JPanel {

    private GestionAbsenceEmployes aControleur;
    private JButton ajouter, modifier, supprimer, afficher, fermer;
    FlowLayout gestionnaireComposant;

    RechercherAbsenceP3() {
    try {
        jbInitP3();
    } catch (Exception e) {
        e.printStackTrace();
    }
        ajouter.addActionListener(aControleur);
        modifier.addActionListener(aControleur);
        supprimer.addActionListener(aControleur);
        afficher.addActionListener(aControleur);
        fermer.addActionListener(aControleur);
    }

    private void jbInitP3() throws Exception {

    gestionnaireComposant = new FlowLayout(FlowLayout.RIGHT);

    this.setLayout(gestionnaireComposant);

    ajouter = new JButton("Ajouter");
    modifier = new JButton("Modifier");
    modifier.setEnabled(false);
    supprimer = new JButton("Supprimer");
    supprimer.setEnabled(false);
    afficher = new JButton("Afficher");
    afficher.setEnabled(false);
    fermer = new JButton("Fermer");

    this.add(ajouter);
    this.add(modifier);
    this.add(supprimer);
    this.add(afficher);
    this.add(fermer);

    }

    public JButton getAjouter() {
        return ajouter;
    }
}

这是窗口

package ca.uqam.inf2120.tp2.interfacegraphique;

import java.awt.BorderLayout;
import ca.uqam.inf2120.tp2.interfacegraphique.RechercherAbsenceP3;
import javax.swing.JFrame;
import javax.swing.JPanel;

import ca.uqam.inf2120.tp2.modele.GestionAbsenceEmployes;

public class CreerRechercherAbsence extends JFrame {

    private GestionAbsenceEmployes aControleur;
    private JPanel absenceP1, absenceP2, absenceP3;

    private BorderLayout gestionnaireComposant;

    public CreerRechercherAbsence() {
        super("Gestionnaire des employés absents");

        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        aControleur = new GestionAbsenceEmployes(this); 

    }

    void jbInit() throws Exception {

        gestionnaireComposant = new BorderLayout(5, 5);
        this.getContentPane().setLayout(gestionnaireComposant);

        absenceP1 = new RechercherAbsenceP1();
        absenceP2 = new RechercherAbsenceP2();
        absenceP3 = new RechercherAbsenceP3();

        this.getContentPane().add(absenceP1, BorderLayout.NORTH);
        this.getContentPane().add(absenceP2, BorderLayout.CENTER);
        this.getContentPane().add(absenceP3, BorderLayout.SOUTH);
    }

}

现在是未完成的 Controller :

    package ca.uqam.inf2120.tp2.modele;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import ca.uqam.inf2120.tp1.partie1.adt.impl.ListeAdtArrayListImpl;
    import ca.uqam.inf2120.tp2.interfacegraphique.CreerRechercherAbsence;

    public class GestionAbsenceEmployes implements ActionListener{

        private AbsenceEmploye modele;
        private CreerRechercherAbsence vue;

        public GestionAbsenceEmployes(CreerRechercherAbsence uneVue) {
            this.modele = new AbsenceEmploye();
            vue = uneVue;
        }

        public AbsenceEmploye getModele() {
            return modele;
        }


        @Override
        public void actionPerformed(ActionEvent event) {
            Object source = event.getSource();
            if(source == vue.getAjouter()) {

            }
        }

}

当我添加 vue.getAjouter() 时,它不知道它是什么!!!

我该怎么做/做错了什么?

最佳答案

问题是您在 ActionListenerCreerRechercherAbsence JFrame 实例上调用 getAjouter()想要在 RechercherAbsenceP3 JPanel 实例上调用 getAjouter()

我的解决方案:

转换您的 ActionListenerGestionAbsenceEmployes 以接受 RechercherAbsenceP3 作为参数,这样我们就可以调用 getAjouter()它的实例是这样的:

class GestionAbsenceEmployes implements ActionListener {

    private AbsenceEmploye modele;
    private RechercherAbsenceP3 vue;

    public GestionAbsenceEmployes(RechercherAbsenceP3 uneVue) {
        this.modele = new AbsenceEmploye();
        vue = uneVue;
    }

    public AbsenceEmploye getModele() {
        return modele;
   }

    @Override
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        if (source == vue.getAjouter()) {
        }
    }
}

你会做的:

    aControleur = new GestionAbsenceEmployes(absenceP3);

但是为了使上述语句起作用,您必须更改它:

private JPanel absenceP1, absenceP2,absenceP3;

CreerRechercherAbsence 类中:

private JPanel absenceP1, absenceP2;
private RechercherAbsenceP3 absenceP3;

因为您扩展了 JPanel 以添加功能,因此 RechercherAbsenceP3 但是通过将其声明为 JPanel 您向下转换它,因此它没有访问扩展 JPanel RechercherAbsenceP3 的方法,并且仅访问默认 JPanel 的方法。

其他一些建议:

  • 不要不必要地扩展JFrame

  • 不需要 getContentPane.add(..) 因为 add(..) 已经转移到 contentPane

  • 确保在 Event Dispatch Thread 上创建和操作 Swing 组件

关于java - 在 MVC 上的一个 Jframe 中有多个带有按钮的 Jpanel,如何在我的 Controller 中获取 actionlistener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13905051/

相关文章:

java - LiquidInf jar 文件

java - java中的不可变属性

model-view-controller - JTemplates 使用 asp.net mvc 格式化日期

java - 对于 JTextField,如何设置另一个类中的文本?

java - Maven Findbugs 插件 - 如何在测试类上运行 findbug

java - JPanel 布局管理器 - 如何防止组件填充空间?

java - 使用 Java Applet 实现键盘监听器

java - switch 语句和返回值 - 如何使用 switch 来确定 JPanel 绘制

php - 从 CodeIgniter(或任何 MVC 平台)的数据库中提取数据?

model-view-controller - 模型- View - Controller 是开发 Web 应用程序的最佳设计模式吗?