TransWikia.com

Problema al ejecutar una clase Controlador

Stack Overflow en español Asked by David Calderon on December 16, 2021

Lo que quiero hacer es crear un Controlador para cada Vista, pero al crear un segundo controlador este no funciona, no abre la ventana o JIntenarFrame que corresponde.

Tengo este código en el controlador de la ventana principal, funciona bien, pues acciona a las órdenes de la Vista:

package ControladorProyecto;

import InterfazProyecto.Proyecto_Admin;
import InterfazProyecto.Proyecto_Clientes;
import static java.awt.Frame.MAXIMIZED_BOTH;
import java.awt.event.*;
import javax.swing.*;

public class Proyecto_ControladorAdmin implements ActionListener{

    private Proyecto_Clientes cliente= null;
    private Proyecto_Admin factureAdmin= null;

    private enum Ventana{
        getJMenuClientes,
    }

    public Proyecto_ControladorAdmin(Proyecto_Admin factureAdmin){
        this.factureAdmin= factureAdmin;
    }

    public void abrirFacture(){
        //Inicialización del Frame factureAdmin
        this.factureAdmin.setTitle("FACTURE");
        this.factureAdmin.setExtendedState(MAXIMIZED_BOTH);
        this.factureAdmin.setVisible(true);

        //Definición de los eventos de los Componentes
        this.factureAdmin.getJMenuClientes().addActionListener(this);
        this.factureAdmin.getJMenuClientes().setActionCommand("getJMenuClientes");
        //this.cc= new ControladorCliente();
    }

    //Centrar los JInternalFrame en el Desktop
    public JInternalFrame centralizarInternalFrame(JInternalFrame InternalFrame) {
        int x = (this.factureAdmin.getDesktop().getWidth() / 2) - InternalFrame.getWidth() / 2;
        int y = (this.factureAdmin.getDesktop().getHeight() / 2) - InternalFrame.getHeight() / 2;
        if (InternalFrame.isShowing()) {
            InternalFrame.setLocation(x, y);
        } else {
            this.factureAdmin.getDesktop().add(InternalFrame);
            InternalFrame.setLocation(x, y);
            InternalFrame.setVisible(true);
            InternalFrame.moveToFront();
        }
        return InternalFrame;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        switch (Ventana.valueOf(ae.getActionCommand())) {

            case getJMenuClientes:
                if (!(this.cliente instanceof Proyecto_Clientes)) {
                    this.cliente = new Proyecto_Clientes();
                    this.cliente.setTitle("CLIENTES");
                    this.centralizarInternalFrame(this.cliente);
                } else if (this.cliente instanceof Proyecto_Clientes) {
                    JOptionPane.showMessageDialog(null, "La ventana ya está abierta");
                }
                break;
        }
    }
}

El verdadero problema está en este código que corresponde al segundo Controlador, no acciona a las órdenes de la Vista abriendo el JInternalFrame que debe:

package ControladorProyecto;

import InterfazProyecto.Proyecto_Admin;
import InterfazProyecto.Proyecto_Clientes;
import InterfazProyecto.Proyecto_NuevoCliente;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;

public class Proyecto_ControladorCliente implements ActionListener{

    private Proyecto_Admin factureAdmin= null;
    private Proyecto_Clientes clientes= null;
    private Proyecto_NuevoCliente nuevoCliente= null;


    private enum Componentes{
        txtBuscarCliente,
        tablaClientes,
        getBtnRegistrarCliente
    }

    public Proyecto_ControladorCliente(Proyecto_Clientes clientes){
        this.clientes= clientes;
    }

    public void abrirCliente(){
        this.clientes.getBtnRegistrarCliente().addActionListener(this);
        this.clientes.getBtnRegistrarCliente().setActionCommand("getBtnRegistrarCliente");
    }

    public JInternalFrame centralizarInternalFrame(JInternalFrame InternalFrame) {
        int x= (this.factureAdmin.getDesktop().getWidth()/2)- InternalFrame.getWidth()/2;
        int y= (this.factureAdmin.getDesktop().getHeight()/2)- InternalFrame.getHeight()/2;
        if(InternalFrame.isShowing()){
            InternalFrame.setLocation(x, y);
        }else{
            this.factureAdmin.getDesktop().add(InternalFrame);
            InternalFrame.setLocation(x, y);
            InternalFrame.setVisible(true);
            InternalFrame.toFront();
        }       
        return InternalFrame;
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        switch (Componentes.valueOf(ae.getActionCommand())) {

            case getBtnRegistrarCliente:
                if (!(this.nuevoCliente instanceof Proyecto_NuevoCliente)) {
                    this.nuevoCliente = new Proyecto_NuevoCliente();
                    this.nuevoCliente.setTitle("NUEVO CLIENTE");
                    this.centralizarInternalFrame(this.nuevoCliente);
                } else if (this.nuevoCliente instanceof Proyecto_NuevoCliente) {
                    JOptionPane.showMessageDialog(null, "La ventana ya está abierta");
                }
                break;
        }
    }
}

No sé por qué el segundo Controlador no me funciona.

Los demás códigos corresponden a los demás JInternalFrame para que puedan reproducir el problema.

El siguiente código corresponde a la clase que inicializa el proyecto.

package Proyecto;

import ControladorProyecto.Proyecto_ControladorAdmin;
import ControladorProyecto.Proyecto_ControladorCliente;
import InterfazProyecto.Proyecto_Clientes;
import InterfazProyecto.Proyecto_Admin;

public class IncializarProyecto {

    public static void main(String[] args) {

        Proyecto_Admin factAdmin = new Proyecto_Admin();
        Proyecto_Clientes cl = new Proyecto_Clientes();

        new Proyecto_ControladorAdmin(factAdmin).abrirFacture();
        new Proyecto_ControladorCliente(cl).abrirCliente();
    }
}

Este es de la Ventana principal del proyecto o ProyectoAdmin:

package InterfazProyecto;

public class Proyecto_Admin extends javax.swing.JFrame {

    public Proyecto_Admin() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        desktop = new javax.swing.JDesktopPane();
        jPanel1 = new javax.swing.JPanel();
        menus = new javax.swing.JMenuBar();
        jMenuProduccion = new javax.swing.JMenu();
        jSubMenuClientes = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        desktop.setBackground(new java.awt.Color(0, 102, 102));

        javax.swing.GroupLayout desktopLayout = new javax.swing.GroupLayout(desktop);
        desktop.setLayout(desktopLayout);
        desktopLayout.setHorizontalGroup(
            desktopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        desktopLayout.setVerticalGroup(
            desktopLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 250, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 23, Short.MAX_VALUE)
        );

        jMenuProduccion.setText("Producción");

        jSubMenuClientes.setText("Clientes");
        jMenuProduccion.add(jSubMenuClientes);

        menus.add(jMenuProduccion);

        setJMenuBar(menus);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktop)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(desktop)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Proyecto_Admin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Proyecto_Admin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Proyecto_Admin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Proyecto_Admin.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Proyecto_Admin().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JDesktopPane desktop;
    private javax.swing.JMenu jMenuProduccion;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JMenuItem jSubMenuClientes;
    private javax.swing.JMenuBar menus;
    // End of variables declaration

    public javax.swing.JDesktopPane getDesktop(){
        return desktop;
    }

    public javax.swing.JMenuItem getJMenuClientes(){
        return jSubMenuClientes;
    }
}

A continuación, este código corresponde al JInternalFrame ProyectoClientes:

package InterfazProyecto;

public class Proyecto_Clientes extends javax.swing.JInternalFrame {

    public Proyecto_Clientes() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tablaClientes = new javax.swing.JTable();
        txtBuscarCliente = new javax.swing.JTextField();
        btnRegistrarCliente = new javax.swing.JButton();

        setClosable(true);
        setIconifiable(true);
        setMaximizable(true);
        setResizable(true);
        setToolTipText("");

        tablaClientes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {},
                {},
                {},
                {}
            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(tablaClientes);

        btnRegistrarCliente.setText("Registrar Cliente");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(txtBuscarCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 353, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE)
                        .addComponent(btnRegistrarCliente)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtBuscarCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnRegistrarCliente))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 304, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    // Variables declaration - do not modify
    private javax.swing.JButton btnRegistrarCliente;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tablaClientes;
    private javax.swing.JTextField txtBuscarCliente;
    // End of variables declaration

    public javax.swing.JTable getTablaClientes(){
        return tablaClientes;
    }

    public javax.swing.JTextField getTxtBuscarClientes(){
        return txtBuscarCliente;
    }

    public javax.swing.JButton getBtnRegistrarCliente(){
        return btnRegistrarCliente;
    }
}

Y por último el código del JInternalFrame que no funciona cuando se acciona el botón del JInternalFrame descrito arriba (ProyectoClientes) y que corresponde al segundo controlador, es este JInternalFrame el que no se muestra en el JDesktopPane de la ventana Proyecto_Admin.

package InterfazProyecto;

public class Proyecto_NuevoCliente extends javax.swing.JInternalFrame {

    public Proyecto_NuevoCliente() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        lblFotoCliente = new javax.swing.JLabel();

        lblFotoCliente.setIcon(new javax.swing.ImageIcon(getClass().getResource("/InterfazProyecto/imagenes/1475738020_kuser.png"))); // NOI18N
        lblFotoCliente.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(lblFotoCliente)
                .addContainerGap(572, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(lblFotoCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(217, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>

    // Variables declaration - do not modify
    private javax.swing.JLabel lblFotoCliente;
    // End of variables declaration
}

2 Answers

¿En qué momento inicializas o inyectas el valor correspondiente a la variable factureAdmin del segundo controlador? En el método centralizarInternalFrame das uso de la variable factureAdmin.

Ejemplo:

int x= (this.factureAdmin.getDesktop().getWidth()/2) InternalFrame.getWidth()/2;
int y= (this.factureAdmin.getDesktop().getHeight()/2)- InternalFrame.getHeight()/2;

La variable factureAdmin es igual a null en esa parte, que lo más probable sea el origen de tu problema, a demás no entiendo bien tu ejemplo. ¿A caso no deberías usar clientes para obtener la información de la altura o anchura?

Si pudieras explicar más a fondo en que consiste cada clase, edito la respuesta y veo si el origen de la problemática cambia. Pero por lo pronto esas son las observaciones que veo en tu código.

Answered by Jesús A. Meza G. on December 16, 2021

Utilza InternalFrame.moveToFront() en lugar de InternalFrame.toFront() en el segundo ejemplo.

Answered by Kevin Cifuentes Salas on December 16, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP