顺便说一句,这是作业,
我被要求制作一个包含多个 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() 时,它不知道它是什么!!!
我该怎么做/做错了什么?
最佳答案
问题是您在 ActionListener
的 CreerRechercherAbsence
JFrame
实例上调用 getAjouter()
想要在 RechercherAbsenceP3
JPanel
实例上调用 getAjouter()
。
我的解决方案:
转换您的 ActionListener
类 GestionAbsenceEmployes
以接受 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/