当我按miALote时,该代码应该从主窗口中创建一个新窗口...但是,不是,我不知道我做错了什么...如果我从控制器中删除if,可以,但这不应该发生。这是主控制器代码:
package Controller.GUI;
import GUI.AltaLote;
import GUI.MenuPrincipal;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Controller implements ActionListener{
MenuPrincipal ventanaControlada;
public Controller(MenuPrincipal win){
this.ventanaControlada=win;
}
public void actionPerformed(ActionEvent e){
if (e.getSource().equals(ventanaControlada.miALote)) {
AltaLote ventana=new AltaLote();
ControllerLote controlador=new ControllerLote(ventana);
ventana.addController(controlador);
ventana.setVisible(true);
}
}
}
主窗口代码:
package GUI;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import Controller.GUI.Controller;
public class MenuPrincipal extends JMenu{
private JFrame frame;
public JMenuItem miALote;
Controller controlador;
private JTable table;
public void addController (Controller mc){
controlador=mc;
}
/**
* Create the application.
*/
public MenuPrincipal() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
public void initialize() {
JMenuItem miALote = new JMenuItem("Dar de alta nuevo lote...");
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu mnLote = new JMenu("Lote");
menuBar.add(mnLote);
mnLote.add(miALote);
miALote.addActionListener(controlador);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(0, 0, 390, 139);
frame.getContentPane().add(scrollPane);
frame.setSize(416, 274);
frame.setVisible(true);
frame.getContentPane().add(table, BorderLayout.WEST);
this.setVisible(true);
}
public JMenuItem getAgregarLote() {
return miALote;
}
public void setAgregarLote(JMenuItem miALote) {
this.miALote = miALote;
}
}
最佳答案
您的代码有多个问题...
当构造MenuPrincipal
的实例的构造函数时,调用initialize
并尝试将controlador
注册为ActionListener
的miALote
,但是controlador
是null
...
调用addController
时,该方法不执行任何操作(将自身注册为ActionListener
)
在MenuPrincipal
中,miALote
被声明为实例字段(public JMenuItem miALote;
),但是您在intitalize
方法中将其声明为局部变量(JMenuItem miALote = new JMenuItem("Dar de alta nuevo lote...");
表示实例字段为null
,因此当您执行if (e.getSource().equals(ventanaControlada.miALote)) {
时,结果将始终为false
...
当创建所有新的MenuPrincipal
时,为什么JMenu
需要从JFrame
扩展?public void setAgregarLote(JMenuItem miALote) {
没有意义,因为您没有在响应呼叫时重建菜单...
您对MVC的概念在我看来似乎很歪斜。您应该避免将UI元素暴露给控制器,因为它并不在乎,它只想知道什么时候发生(基于达成一致的合同)并响应事件
坦白说,如果您不首先提供可运行的代码示例,我不知道如何帮助您...