actionPerformed和方法等于不使用控制器

时间:2014-12-18 01:24:58

标签: java swing actionlistener

当我按下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;
}

}

1 个答案:

答案 0 :(得分:1)

您的代码存在多个问题......

  • 当构造函数是MenuPrincipal的实例时,您调用initialize并尝试将controlador注册为ActionListener的{​​{1}},但是miALotecontrolador ...
  • 调用null时,该方法无效(将自己注册为addController
  • ActionListener中,MenuPrincipal被声明为实例字段(miALote),但您将其声明为public JMenuItem miALote;方法中的局部变量({{1}意味着实例字段为intitalize,因此当您执行JMenuItem miALote = new JMenuItem("Dar de alta nuevo lote...");时,结果将始终为null ...
  • 为什么if (e.getSource().equals(ventanaControlada.miALote)) {需要从false扩展,只需创建一个新的MenuPrincipal
  • JMenu毫无意义,因为您没有重新启动菜单以响应通话...
  • 你的MVC概念似乎对我很不利。您应该避免将UI元素暴露给控制器,因为它不应该关心,它只想知道什么时候发生(基于约定的合同)并响应事件
  • 坦率地说,如果没有您首先提供代码的可运行示例,我不知道如何帮助您......