这是一项家庭作业,我被要求制作一个包含多个jpanel的jframe,这些jpanel带有按钮和动作侦听器。我必须使用MVC模型来执行此操作,但是由于我的按钮/操作位于jpanels中而不是jframe中,所以我不知道如何恢复它们。我不会放下所有代码,只是看我想做什么所需要的。我想首先从面板3中获取按钮“ ajouter”以执行任何操作:这是面板3import 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); }}现在尚未完成的控制程序: 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()时,它不知道它是什么!我该怎么办/弄错了? 最佳答案 问题是您要在getAjouter()的CreerRechercherAbsence JFrame实例上调用ActionListener,而您想在getAjouter() RechercherAbsenceP3的实例上调用JPanel。我的解决方案:将您的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(..)已转移到contentPane确保在add(..)上创建和操作Swing组件关于java - 在MVC上的一个Jframe中,带有按钮的多个Jpanel,如何在我的 Controller 中获得actionlistener?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13905051/