Функция dispose () закрывает полностью инстанцию? [удвоенная]

У этого вопроса уже есть ответ здесь:

У меня есть один JFrame что, нажав на кнопку, закрывается посредством одного dispose(), но в течение выполнения, если пользователь это желает, смоги вновь открывать это и она явится различной информацией.

Проблема состоит в том, что первый раз, который открывается, функционирует совершенно, но когда он открывается во второй раз, начинает не удаваться. labels, видны два раза и события прекращают функционировать, как они были бы должны, и если он открывается в третий раз, labels, выходят три раза. Он как будто dispose() он не удалял инстанцию но он скрывал ее, и мне нужно, чтобы закрылась полностью эта инстанция и только вновь появлялась, если верили в другую инстанцию, но что был новостью, не предыдущей.

Здесь frame, с которым у меня есть проблемы:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import com.lhumanizado.glenis.classes.TempData;

public class Gastos extends JFrame implements ActionListener{

    public static ArrayList<TempData> db = new ArrayList();
    //Fuente
    public static boolean source = false;
    //Contador
    int count = 0;
    //Espacio del panel de Comision
    public static Component espace = Box.createVerticalStrut(12);
    //Elementos
    public static JTextField operacion = new JTextField(20);
    public static JTextField monto = new JTextField(20);
    public static JButton aceptar = new JButton("Aceptar");
    public static JButton finalizar = new JButton("Finalizar");
    //Paneles del Centro
    public static JPanel panelDescripcion = new JPanel();
    public static JPanel panelMonto = new JPanel();
    //Paneles de abajo
    public static JPanel abajoNorth = new JPanel();
    public static JPanel abajoSouth = new JPanel();
    public static JPanel abajoCenter = new JPanel();
    //Paneles Principales
    public static JPanel principal = new JPanel();
    public static JPanel arriba = new JPanel();
    public static JPanel abajo = new JPanel();

    //Labels de los Montos Finales
    JLabel labelTotal = new JLabel("Total");
    JLabel montoTotal = new JLabel("0.0" );

    Gastos(){
        super("Crea un nuevo estado de cuenta");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(950,500);
        setLayouts();
        addElements();
        JScrollPane scroller = new JScrollPane(principal);
        add(scroller);
        setVisible(true);
        setLocationRelativeTo(null);
        getRootPane().setDefaultButton(aceptar);
    }

    public void setLayouts(){
        principal.setLayout(new BoxLayout(principal, BoxLayout.Y_AXIS));
        abajo.setLayout(new BorderLayout());
        abajoNorth.setLayout(new FlowLayout(FlowLayout.CENTER));
        abajoCenter.setLayout(new FlowLayout());
        abajoSouth.setLayout(new FlowLayout(FlowLayout.TRAILING));
        panelDescripcion.setLayout(new BoxLayout(panelDescripcion, BoxLayout.Y_AXIS));
        panelMonto.setLayout(new BoxLayout(panelMonto, BoxLayout.Y_AXIS));
    }

    public void addElements(){
        //Elementos del Panel de Arriba
        arriba.add(new JLabel("Mes:"));
        arriba.add(Box.createHorizontalStrut(15));
        arriba.add(new JLabel("Tipo de Operacion:"));
        arriba.add(operacion);
        arriba.add(Box.createHorizontalStrut(15));
        arriba.add(new JLabel("Monto:"));
        arriba.add(monto);
        arriba.add(Box.createHorizontalStrut(15));
        aceptar.addActionListener(this); //Listener del boton
        finalizar.addActionListener(this); //Listener del boton para guardar
        arriba.add(aceptar);
        arriba.add(Box.createVerticalStrut(40)); 
        //Boton de abajo
        abajoSouth.add(finalizar);
        //Paneles del centro
        prepararCentro();
        abajoCenter.add(Box.createHorizontalStrut(15));
        abajoCenter.add(panelDescripcion);
        abajoCenter.add(Box.createHorizontalStrut(300));
        abajoCenter.add(panelMonto);
        valorFinalShow();
        //Elementos del Panel de Abajo
        abajo.add(abajoNorth, BorderLayout.NORTH);
        abajo.add(abajoCenter, BorderLayout.CENTER);
        abajo.add(abajoSouth, BorderLayout.SOUTH);
        principal.add(arriba);
        principal.add(new JSeparator(JSeparator.HORIZONTAL));//Linea del medio
        principal.add(abajo);
    }

    public static void prepararCentro(){
        panelDescripcion.add(Box.createVerticalStrut(15)); //Espacio
        panelMonto.add(new JLabel("Monto"));
        panelMonto.add(Box.createVerticalStrut(15)); //Espacio
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource().equals(aceptar)){
            try{
                if(!operacion.getText().equals("")){
                    db.add(new TempData(operacion.getText(), Double.parseDouble(monto.getText())));
                    valorFinal();
                    add(count);
                    valorFinalShow();
                    monto.setText(null);
                    operacion.setText(null);
                    count++;
                    validate();
                    repaint();
                }else{
                    JOptionPane.showMessageDialog(null, "Ingrese una operacion valida!");
                    monto.setText(null);
                    operacion.setText(null);
                }    
            }catch(NumberFormatException ex){
                JOptionPane.showMessageDialog(null, "Inserte un valor valido!");
                monto.setText(null);
                operacion.setText(null);
            }
        }else{
            new Bienvenida();dispose();System.gc();
        }
    }

    public void add(int count){
        panelDescripcion.add(new JLabel(db.get(count).operacion));
        panelDescripcion.add(Box.createVerticalStrut(10));
        panelMonto.add(new JLabel(String.valueOf(db.get(count).monto)));
        panelMonto.add(Box.createVerticalStrut(10));
    }

    public void valorFinalShow(){
        //Añade los labels
        panelDescripcion.add(labelTotal);
        //Añade los montos             
        panelMonto.add(montoTotal);
    }

    public void valorFinal(){
        double tmp = 0;
        for(int i = 0; db.size() > i; i++){
            tmp += db.get(i).monto;
        }
        montoTotal.setText(String.valueOf(tmp));
    }

    public void renew(){
        panelDescripcion.removeAll();
        panelMonto.removeAll();
        prepararCentro();
        valorFinal();
        for(int i = 0; i< db.size();i++){
                add(i);
        }
        count = db.size();
        valorFinalShow();
        validate();
        repaint();
    }

}

class TempData {
    public String operacion = "";
    public double monto = 0;

    public TempData(String operacion, double monto){
        this.operacion = operacion;
        this.monto = monto;
    }
}

И это Frame, который это призывает

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Bienvenida extends JFrame implements ActionListener{

    //Creacion de Botones
    JButton editar = new JButton(new ImageIcon("C:/Users/Josue/Documents/NetBeansProjects/Glenis/src/com/lhumanizado/glenis/img/edit.png"));
    JButton nuevo = new JButton(new ImageIcon("C:/Users/Josue/Documents/NetBeansProjects/Glenis/src/com/lhumanizado/glenis/img/save.png"));
    JPanel derecha = new JPanel(); //Panel de Nuevo
    Bienvenida(){
        //Operaciones del Frame
        super("Bienvenido, admin!");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(350,245);
        //Añade los listeners
        nuevo.addActionListener(this);
        editar.addActionListener(this);
        //Creacion de los Labels
        JLabel labelEditar = new JLabel("Editar");
        JLabel labelNuevo = new JLabel("Nuevo");
        //Creacion de los Paneles
        JPanel principal = new JPanel(); //Panel principal
        JPanel centro = new JPanel();
        JPanel izquierda = new JPanel(); //Panel de Editar

        //Asignacion de Layouts
        izquierda.setLayout(new BoxLayout(izquierda, BoxLayout.Y_AXIS));
        derecha.setLayout(new BoxLayout(derecha, BoxLayout.Y_AXIS));
        principal.setLayout(new BoxLayout(principal, BoxLayout.Y_AXIS));
        //ToolTipText
        nuevo.setToolTipText("Crea un nuevo estado de cuenta");
        editar.setToolTipText("Edita un estado de cuenta existente");
        //Añadir objetos al panel de la izquierda
        izquierda.add(editar);
        izquierda.add(labelEditar);
        //Alinea ambos en el centro de cada uno
        editar.setAlignmentX(Component.CENTER_ALIGNMENT);
        labelEditar.setAlignmentX(Component.CENTER_ALIGNMENT);
        //Añadir objetos al panel de la derecha
        derecha.add(nuevo);
        derecha.add(labelNuevo);
        //Alinea Ambos en el centro de cada uno
        nuevo.setAlignmentX(Component.CENTER_ALIGNMENT);
        labelNuevo.setAlignmentX(Component.CENTER_ALIGNMENT);

        principal.add(Box.createVerticalStrut(20));//Espacio en blanco de arriba
        //Añadir los objetos del centro
        centro.add(izquierda);
        centro.add(Box.createHorizontalStrut(20));//Espacio en blanco entre editar y nuevo
        centro.add(derecha);

        principal.add(Box.createVerticalStrut(20));//Espacio en blanco de abajo
        //Añadir a principal
        principal.add(centro);

        setLocationRelativeTo(null);
        add(principal);
        setVisible(true);


    }

    @Override
    public void actionPerformed(ActionEvent evt){
        if(evt.getSource() == nuevo){
            new Gastos();
        }
        dispose();
    }
    public static void main(String [] args){
        new Bienvenida();
    }
}
2
задан 16.01.2017, 02:09
0 ответов

Проблема, которая у тебя есть, чем в классе Gastos у тебя есть много очевидных элементов estáticamente. Это означает, что первый раз, который использует класс Gastos ты создаешь объекты, которые потом ты наполняешь каждый раз, когда ты создаешь объект типа Gastos (что не является тем же самым, что и другой полужирный шрифт.

Как пример я помещаю тебе переменную panelMonto:

  1. Ты создаешь панель первый раз, который использует класс с public static JPanel panelMonto = new JPanel();
  2. Ты добавляешь элементы каждый раз, когда ты создаешь новый объект типа Gasto. Например к этой линии ты добавляешь этикетку panelMonto.add(new JLabel("Monto"));

Это поведение ты это повторяешь в каждой части кода, который ты говоришь, что она выходит у тебя повторенной.

То, что ты должен делать:

  1. Удалять эти статические заявления, которые ни для чего не служат, больше ничто, что для того, чтобы с любой части твоего кода смогли меняться эти элементы (даже объявлять их null). Это очень плохая практика программирования
  2. Прекращать создавать новые инстанции каждый раз, когда ты захотел показать окно. В Вашем месте находятся другие способы избавляться от окон как например dispose() или setVisible(false). После, когда ты захочешь вновь показать ее, ты вновь делаешь ее видимой.

Если ты продолжаешь код вопроса, который я поместил, как дублированная ты сделаешь то, что ты хочешь.

1
ответ дан 03.12.2019, 17:41