entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Limpiar objetos y recargar GUI

Buenas noches compañeros, ya he comunicado en otros post algunos problemas que me han surgido...el tema ahora es que nunca he tenido que hacer nada tan grande como la aplicación en la que estoy metido (por mero gusto).

El tema es:

package SQLDEVELOPER;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JTextField;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Point;

public class Tablas extends JFrame {
    int columna, fila, num;

    private static final long serialVersionUID = 2208659110161828487L;
    private JTextField NombreTabla;
    private JMenu MenuDatos, MenuOpc;
    private JMenuItem item1, item2, item3;
    private JMenuBar BarraMenu;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Tablas frame = new Tablas ();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * Create the frame.
     */
    public Tablas() {
        //Propiedades de la ventana o JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocation(new Point(300, 150));
        getContentPane().setLayout(null);
        setSize(620, 350);
        setLocationRelativeTo(null);
        setVisible(true);

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                accionar(arg0);
            }
        };

        NombreTabla = new JTextField();
        NombreTabla.setText("Nombre de la Tabla");
        NombreTabla.setBounds(10, 11, 117, 20);
        getContentPane().add(NombreTabla);
        NombreTabla.setColumns(10);

        //Instancio un menú de opciones
        BarraMenu = new JMenuBar();
        BarraMenu.setBounds(130, 11, 110, 20);
        getContentPane().add(BarraMenu);
        MenuDatos = new JMenu("¿Cuantos datos?");
        BarraMenu.add(MenuDatos);
        item1 = new JMenuItem("1");
        item1.addActionListener(listener);
        MenuDatos.add(item1);

        item2 = new JMenuItem("2");
        item2.addActionListener(listener);
        MenuDatos.add(item2);

        item3 = new JMenuItem("3");
        item3.addActionListener(listener);
        MenuDatos.add(item3);

    }

    public void accionar(ActionEvent evt) {
        int quantity = Integer.parseInt(evt.getActionCommand());
        //System.out.println(quantity);
        JTextField[] campos = new JTextField[quantity];
        columna = 20;
        fila = 50;
        for (int i = 0; i < quantity; i++) {
            campos[i] = new JTextField();
            campos[i].setBounds(columna, fila, 80, 20);
            getContentPane().add(campos[i]);//adiciono al contentpane
            fila += 30;
        }
        for (int z = 0; z < quantity; z++){
            getContentPane().remove(campos[z]);
        }
        JMenuBar[] MenuBar = new JMenuBar[quantity];
        columna = 110;
        fila = 50;
        for (int x = 0; x < quantity; x++){
            MenuBar[x] = new JMenuBar();
            MenuBar[x].setBounds(columna, fila, 80, 20);
            getContentPane().add(MenuBar[x]);
            MenuOpc = new JMenu("Tipo de datos");
            MenuBar[x].add(MenuOpc);
            fila += 30;

            item1 = new JMenuItem("1");
            item1.addActionListener(null);
            MenuOpc.add(item1);
        }
        this.repaint();
    }
}

Necesito que, cuando yo por ejemplo tengo 3 objetos generados de forma dinámica, al darle por ejemplo a 2 en el JMenuBar, se recargue de tal forma que solo aparezca el número de objetos que se requieren...

A ver si me podéis echar una mano con esto :D

0voto

Leonardo-Tadei comentado

Hola @Yesod,

no es la respuesta correcta la de @jonatan_castro ???

0voto

Yesod comentado

Si, el tema es que la respuesta correcta esta como comentario a una respuesta que yo di...por eso mismo he dado esa como válida...no se como hacer para poner un comentario dentro de una respuesta como válido.

Pongo como respuesta la solución total del problema, si estoy equivocado, por favor, dímelo, de todas formas estoy encantado con el trato que recibo y si tengo que poner su respuesta como correcta, lo hago sin problema, pero ya digo, pongo como solución, la solución total del programa.

PD: Si algún moderador puede modificar su comentario como respuesta, cambio la selección :D

0voto

Leonardo-Tadei comentado

Hola @Yesod,

en este caso es fácil: repetí la respuesta completa que lograste gracias a la ayuda de @jonatan_castro como un comentario a la respuesta que el mismo da más abajo, y luego podés marcar su respuesta como la seleccionada.

La sugerencia de marcar como mejor respuesta la de Jonatan no es solo para atribuirle el mérito, sino como una sencilla forma de agradecimiento que sirve para entuasimarlo a que siga participando con sus conocimientos.

Tampoco es que sea importantísimo, pero creo que ayuda a que todos participen con más ganas.

Saludos cordiales!

2 Respuestas

3votos

jonatancastro1 Puntos3130

Ya probaste:

this.revalidate(); 

antes de

this.repaint();

0voto

Yesod comentado

Si pongo ambos, me pinta bien los MenuBar dinámicos :D

El problema es que no se como hacer para que cuando yo selecciono en el JMenuBar estático una cantidad nueva de objetos, los sobrantes desaparezcan...

0voto

jonatancastro1 comentado

Lo que entiendo es que en esta parte del código:

JMenuBar[] MenuBar = new JMenuBar[quantity];

es donde creas los elementos dinámicos y estos son los que quieres remover antes de agregar los nuevos.

El problema es que para quitarlos hay que llamar al método remove del container que obtienes por medio de getContentPane, y pasarle la referencia del JMenuBar que hereda de Component.

getContentePane.remove(MenuBar[x]);

Pero para esto necesitas que el arreglo este declarado en el ámbito de la clase y no del método accionar y asi primero borrar los elementos antes de agregar los nuevos quedaría algo así:

private JMenuBar[] menuBar = null;
...
public void accionar(ActionEvent evt) {
    ....
    if(menuBar != null){
           for(JMenuBar menu : menuBar){
                   getContentPane.remove(menu);
           }
           menuBar = null;
    }else{
         menuBar = new JMenuBar[quantity];
    }
}

y luego revalidar, repintar etc. Saludos

0voto

Yesod comentado

El problema que me surge es que me lo toma como unused...entonces me lo pone en amarillo y tal...

Lo he puesto asi:

package SQLDEVELOPER;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JTextField;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Point;

public class Tablas extends JFrame {
    int columna, fila, num;

    private static final long serialVersionUID = 2208659110161828487L;
    private JTextField NombreTabla;
    private JMenu MenuDatos, MenuOpc, Submenu1;
    private JMenuItem item1, item2, item3, subitem1, subitem2;
    private JMenuBar BarraMenu;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Tablas frame = new Tablas ();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * Create the frame.
     */
    public Tablas() {
        //Propiedades de la ventana o JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocation(new Point(300, 150));
        getContentPane().setLayout(null);
        setSize(620, 350);
        setLocationRelativeTo(null);
        setVisible(true);

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                accionar(arg0);
            }
        };

        NombreTabla = new JTextField();
        NombreTabla.setText("Nombre de la Tabla");
        NombreTabla.setBounds(10, 11, 117, 20);
        getContentPane().add(NombreTabla);
        NombreTabla.setColumns(10);

        //Instancio un menú de opciones
        BarraMenu = new JMenuBar();
        BarraMenu.setBounds(130, 11, 110, 20);
        getContentPane().add(BarraMenu);
        MenuDatos = new JMenu("¿Cuantos datos?");
        BarraMenu.add(MenuDatos);
            item1 = new JMenuItem("1");
            item1.addActionListener(listener);
            MenuDatos.add(item1);

            item2 = new JMenuItem("2");
            item2.addActionListener(listener);
            MenuDatos.add(item2);

            item3 = new JMenuItem("3");
            item3.addActionListener(listener);
            MenuDatos.add(item3);

    }

    public void accionar(ActionEvent evt) {
        int quantity = Integer.parseInt(evt.getActionCommand());
        //System.out.println(quantity);
        JTextField[] campos = null;
        columna = 20;
        fila = 50;

        for (int i = 0; i < quantity; i++) {
            campos[i] = new JTextField();
            campos[i].setBounds(columna, fila, 80, 20);
            getContentPane().add(campos[i]);//adiciono al contentpane
            fila += 30;
        }
        JMenuBar[] MenuBar = null;
        columna = 110;
        fila = 50;
        if(MenuBar != null) {
            for(JMenuBar menu : MenuBar){
                getContentPane().remove(menu);
            }
            MenuBar = null;
        }else{
              MenuBar = new JMenuBar[quantity];
              for (int x = 0; x < quantity; x++){
                MenuBar[x] = new JMenuBar();
                MenuBar[x].setBounds(columna, fila, 85, 20);
                getContentPane().add(MenuBar[x]);
                MenuOpc = new JMenu("Tipo de dato");
            MenuBar[x].add(MenuOpc);
            fila += 30;
          }
        }

            Submenu1 = new JMenu("Numérico");
            MenuOpc.add(Submenu1);
                subitem1 = new JMenuItem("Byte");
                Submenu1.add(subitem1);
                subitem2 = new JMenuItem("Int");
                Submenu1.add(subitem2);
            item2 = new JMenuItem("Texto");
            MenuOpc.add(item2);
            item3 = new JMenuItem("Fecha");
            MenuOpc.add(item3);

        this.repaint();
        this.revalidate();
    }

1voto

Yesod Puntos3550

El problema que me surge es que me lo toma como unused...entonces me lo pone en amarillo y tal...

Lo he puesto asi:

package SQLDEVELOPER;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JTextField;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Point;

public class Tablas extends JFrame {
    int columna, fila, num;

    private static final long serialVersionUID = 2208659110161828487L;
    private JTextField NombreTabla;
    private JMenu MenuDatos, MenuOpc, Submenu1;
    private JMenuItem item1, item2, item3, subitem1, subitem2;
    private JMenuBar BarraMenu;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Tablas frame = new Tablas ();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    /**
     * Create the frame.
     */
    public Tablas() {
        //Propiedades de la ventana o JFrame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocation(new Point(300, 150));
        getContentPane().setLayout(null);
        setSize(620, 350);
        setLocationRelativeTo(null);
        setVisible(true);

        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                accionar(arg0);
            }
        };

        NombreTabla = new JTextField();
        NombreTabla.setText("Nombre de la Tabla");
        NombreTabla.setBounds(10, 11, 117, 20);
        getContentPane().add(NombreTabla);
        NombreTabla.setColumns(10);

        //Instancio un menú de opciones
        BarraMenu = new JMenuBar();
        BarraMenu.setBounds(130, 11, 110, 20);
        getContentPane().add(BarraMenu);
        MenuDatos = new JMenu("¿Cuantos datos?");
        BarraMenu.add(MenuDatos);
            item1 = new JMenuItem("1");
            item1.addActionListener(listener);
            MenuDatos.add(item1);

            item2 = new JMenuItem("2");
            item2.addActionListener(listener);
            MenuDatos.add(item2);

            item3 = new JMenuItem("3");
            item3.addActionListener(listener);
            MenuDatos.add(item3);

    }

    public void accionar(ActionEvent evt) {
        int quantity = Integer.parseInt(evt.getActionCommand());
        //System.out.println(quantity);
        JTextField[] campos = null;
        columna = 20;
        fila = 50;

        for (int i = 0; i < quantity; i++) {
            campos[i] = new JTextField();
            campos[i].setBounds(columna, fila, 80, 20);
            getContentPane().add(campos[i]);//adiciono al contentpane
            fila += 30;
        }
        JMenuBar[] MenuBar = null;
        columna = 110;
        fila = 50;
        if(MenuBar != null) {
            for(JMenuBar menu : MenuBar){
                getContentPane().remove(menu);
            }
            MenuBar = null;
        }else{
              MenuBar = new JMenuBar[quantity];
              for (int x = 0; x < quantity; x++){
                MenuBar[x] = new JMenuBar();
                MenuBar[x].setBounds(columna, fila, 85, 20);
                getContentPane().add(MenuBar[x]);
                MenuOpc = new JMenu("Tipo de dato");
            MenuBar[x].add(MenuOpc);
            fila += 30;
          }
        }

            Submenu1 = new JMenu("Numérico");
            MenuOpc.add(Submenu1);
                subitem1 = new JMenuItem("Byte");
                Submenu1.add(subitem1);
                subitem2 = new JMenuItem("Int");
                Submenu1.add(subitem2);
            item2 = new JMenuItem("Texto");
            MenuOpc.add(item2);
            item3 = new JMenuItem("Fecha");
            MenuOpc.add(item3);

        this.repaint();
        this.revalidate();
    }

0voto

jonatancastro1 comentado

pero

 JMenuBar[] MenuBar = null;

debes declararlo en el ámbito de la clase si no se perderían las referencias anteriores debes quitar esa linea del método accionar y agregar junto a los otros miembros de la clase, algo asi:

private static final long serialVersionUID = 2208659110161828487L;
private JTextField NombreTabla;
private JMenu MenuDatos, MenuOpc, Submenu1;
private JMenuItem item1, item2, item3, subitem1, subitem2;
private JMenuBar BarraMenu;
private JMenuBar[] MenuBar = null;

0voto

Yesod comentado

Vale, ahora ya funciona mas o menos como yo quiero, lo que pretendo es que al seleccionar una cantidad nueva de objetos a generar, se borre y se genere. Lo que hace ahora es que solo borra y luego hay que volver a darle :D

Vale! Ya esta conseguido:

 public void accionar(ActionEvent evt) {
        int quantity = Integer.parseInt(evt.getActionCommand());
        columna = 20;
        fila = 50;
        if (campos != null){
            for (JTextField cajatexto : campos){
                getContentPane().remove(cajatexto);
            }
            campos = null;
            if (campos == null) {
                campos = new JTextField[quantity];
                for (int i = 0; i < quantity; i++) {
                    campos[i] = new JTextField();
                    campos[i].setBounds(columna, fila, 80, 20);
                    getContentPane().add(campos[i]);//adiciono al contentpane
                    fila += 30;
                }
            }
        }else {
            campos = new JTextField[quantity];
            for (int i = 0; i < quantity; i++) {
                campos[i] = new JTextField();
                campos[i].setBounds(columna, fila, 80, 20);
                getContentPane().add(campos[i]);//adiciono al contentpane
                fila += 30;
            }
        }

Pongo solo una parte del código, porque la otra parte para generar los Menús, es identica xD

0voto

jonatancastro1 comentado

Quita esto del else, jejeje se me paso :P

}else{
    MenuBar = new JMenuBar[quantity];
    for (int x = 0; x < quantity; x++){
         MenuBar[x] = new JMenuBar();
         MenuBar[x].setBounds(columna, fila, 85, 20);
         getContentPane().add(MenuBar[x]);
         MenuOpc = new JMenu("Tipo de dato");
         MenuBar[x].add(MenuOpc);
        fila += 30;
     }
}

y deja el código simplemente luego del if(){...}

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta