当我按下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;
}
}
答案 0 :(得分:1)
您的代码存在多个问题......
MenuPrincipal
的实例时,您调用initialize
并尝试将controlador
注册为ActionListener
的{{1}},但是miALote
是controlador
... 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
毫无意义,因为您没有重新启动菜单以响应通话...