当我按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注册为ActionListenermiALote,但是controladornull ...
调用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元素暴露给控制器,因为它并不在乎,它只想知道什么时候发生(基于达成一致的合同)并响应事件
坦白说,如果您不首先提供可运行的代码示例,我不知道如何帮助您...

10-07 12:12